Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用具有相同键的shell脚本替换json文件中的条目_Json_Bash_Shell_Xidel - Fatal编程技术网

使用具有相同键的shell脚本替换json文件中的条目

使用具有相同键的shell脚本替换json文件中的条目,json,bash,shell,xidel,Json,Bash,Shell,Xidel,下面是json文件的一部分 "field1": { "podSize": "S", "totalAuxVMs": 0 }, "field2": { "keyId": "sdfsafdgaadgfdasdfsdfdsfafgfdgfhfghgf" }, "field3": {

下面是json文件的一部分

   "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解析器?