使用具有相同键的shell脚本替换json文件中的条目
下面是json文件的一部分使用具有相同键的shell脚本替换json文件中的条目,json,bash,shell,xidel,Json,Bash,Shell,Xidel,下面是json文件的一部分 "field1": { "podSize": "S", "totalAuxVMs": 0 }, "field2": { "keyId": "sdfsafdgaadgfdasdfsdfdsfafgfdgfhfghgf" }, "field3": {
"field1": {
"podSize": "S",
"totalAuxVMs": 0
},
"field2": {
"keyId": "sdfsafdgaadgfdasdfsdfdsfafgfdgfhfghgf"
},
"field3": {
"keyId": "kdsahfkjdsfjsdfdsapodsporpow"
},
"field4": {
}
我想分别替换field2和field3的keyId。我试过sed,但它不起作用。我试过了
sed -i 's/\"field2\": \{ \"keyId\":.*/\"field2\": \{ \"keyId\": '${new_key}'/g' "/path/to/my.json"
但这是一个错误
sed: -e expression #1, char 58: Unmatched \{
请提供任何帮助。我建议使用jq处理json: 无论如何,如果它是一个限制,请使用sed命令,gnused有一个选项,-z,用于空分隔记录(行)。 您的示例的问题是转义特殊字符和换行符 然后,使用-z选项更改field2的keyId值:
sed -z 's/"field2": {\n "keyId": "[a-zA-Z0-9]*"/"field2": {\n "keyId": "newValue"/g' my.json
还是第三场
sed -z 's/"field3": {\n "keyId": "[a-zA-Z0-9]*"/"field3": {\n "keyId": "newValue"/g' my.json
my.json包含您的文件
请注意,如果对空格数进行了精确匹配,则可以改进该模式。将正则表达式用于它不适用的对象,这太容易出错。请改用类似的JSON解析器 您可以使用其对象编辑扩展
$ xidel -s input.json -e '($json).field2.keyId:="'$new_key'"' | \
xidel -s - -e '($json).field3.keyId:="'$new_key'"'
…或者(最好)以XQuery 3.1的方式进行操作
$ xidel -s input.json -e 'map:merge(($json,({"field2":{"keyId":"'$new_key'"}},{"field3":{"keyId":"'$new_key'"}})),{"duplicates":"use-last"})'
美化查询:
-e '
map:merge(
(
$json,
(
{"field2":{"keyId":"'$new_key'"}},
{"field3":{"keyId":"'$new_key'"}}
)
),
{"duplicates":"use-last"}
)
'
输出:
{
"field1": {
"podSize": "S",
"totalAuxVMs": 0
},
"field2": {
"keyId": "<value of $new_key>"
},
"field3": {
"keyId": "<value of $new_key>"
},
"field4": {}
}
{
“字段1”:{
“podSize”:“S”,
“totalAuxVMs”:0
},
“字段2”:{
“密钥ID”:”
},
“字段3”:{
“密钥ID”:”
},
“字段4”:{}
}
为什么不使用像jq top parse JSON这样合适的JSON解析器?