【发布时间】:2020-07-01 16:27:51
【问题描述】:
我有一个需要替换特定值的 .json 文件:
{
"partitions": [
{
"filesystem_type": "FAT",
"label": "boot",
"mkfs_options": "-F 32",
"partition_size_nominal": 256,
"uncompressed_tarball_size": 53,
"want_maximised": false,
"sha256sum": "dd54710df7756e64cff43bba3c930e85c97f22d43e0d32bc37396be34166c148"
},
{
"filesystem_type": "ext4",
"label": "root",
"mkfs_options": "-O ^huge_file",
"partition_size_nominal": 1415,
"uncompressed_tarball_size": 1015,
"want_maximised": true,
"sha256sum": "bb0892d4a028ae9d282849d05adf851fe54173013f6331e74a4bdd07e4af8dab"
}
]
}
特别需要替换root分区的partition_size_nominal标签
我能想出的最好方法是非常hacky:
#!/bin/bash
fname=partitions.json
tag=partition_size_nominal
newvalue=2942
rootline=$(sed -n '/label.*root/=' $fname | head -1)
blockstart=$(sed -n '1,'"$rootline"'p' $fname | tac | sed -n '/{/=' | head -1)
blockstart=$(( rootline - blockstart + 1 ))
blockend=$(sed -n ''"$blockstart"',$p' $fname | sed -n '/}/=' | head -1)
blockend=$(( blockstart + blockend -1 ))
sed ''"$blockstart"','"$blockend"'s/"'"$tag"'".*/"'"$tag"'": '"$newvalue"',/' $fname
基本思路是:找到根标签标签,向后搜索块开始,向前搜索块结束,替换块内的分区大小标签值。我不能假设分区大小标签在标签标签之后,因此搜索块边界。
有没有人知道针对这种情况的更优雅的解决方案?
【问题讨论】:
-
jq 是一个理解 json 的 cli 工具,在这里比 sed 更容易使用
-
谢谢,我会调查的
-
这能回答你的问题吗? Parsing JSON with Unix tools