json - 在不丢弃文档其余部分的情况下更改 JSON 列表中与条件匹配的条目

标签 json bash edit jq

我正在尝试打开一个文件,查看文件并根据该值更改一个值,然后将其传递给文件或变量。 以下是 JSON 的示例

{
     "Par": [
         {
             "Key": "12345L",
             "Value": "https://100.100.100.100:100",
             "UseLastValue": true
         },
         {
             "Key": "12345S",
             "Value": "VAL2CHANGE",
             "UseLastValue": true
         },
         {
             "Key": "12345T",
             "Value": "HAPPY-HELLO",
             "UseLastValue": true
         }
     ],
      "CANCOPY": false,
      "LOGFILE": ["HELPLOG"]
 }

我一直在使用 jq,我已经成功地隔离了对象组并更改了值。

 cat jsonfile,json | jq '.Par | map(select(.Value=="VAL2CHANGE")) | .[] | .Value="VALHASBEENCHANGED"'

这给出了

         {
             "Key": "12345S",
             "Value": "VALHASBEENCHANGED",
             "UseLastValue": true
         }

id 想要实现的是保留具有更改值的完整 JSON 输出

{
     "Par": [
         {
             "Key": "12345L",
             "Value": "https://100.100.100.100:100",
             "UseLastValue": true
         },
         {
             "Key": "12345S",
             "Value": "VALHASBEENCHANGED",
             "UseLastValue": true
         },
         {
             "Key": "12345T",
             "Value": "HAPPY-HELLO",
             "UseLastValue": true
         }
     ],
      "CANCOPY": false,
      "LOGFILE": ["HELPLOG"]
 }

jq '.Par | map(select(.Value=="VAL2CHANGE")) | .[] | .Value="VALHASBEENCHANGED"' (NOW PUT IT BACK IN FILE)

打开文件,查看文件,要更改的文件值,更改并输出到文件或屏幕

要补充一点,json 文件将只包含我在创建它时查找一次的值。如果任何其他值需要更改,我将以不同的方式命名。

最佳答案

jq --arg match "VAL2CHANGE" \
   --arg replace "VALHASBEENCHANGED" \
  '.Par |= map(if .Value == $match then (.Value=$replace) else . end)' \
  <in.json

要更全面地替换嵌套数据结构中任何位置的字符串,您可以使用 walk 函数——该函数将包含在 jq 1.6 的标准库中,但可以手动提取在 1.5 中:

jq --arg match "VAL2CHANGE" \
   --arg replace "VALHASBEENCHANGED" '

# taken from jq 1.6; will not be needed here after that version is released.
# Apply f to composite entities recursively, and to atoms
def walk(f):
  . as $in
  | if type == "object" then
      reduce keys_unsorted[] as $key
        ( {}; . + { ($key):  ($in[$key] | walk(f)) } ) | f
  elif type == "array" then map( walk(f) ) | f
  else f
  end;

walk(if . == $match then $replace else . end)' <in.json

关于json - 在不丢弃文档其余部分的情况下更改 JSON 列表中与条件匹配的条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51658522/

相关文章:

html - 仅使用 html 和 css 调整图像大小

json - 将 JSON 映射到 TS 类。如果 property 是一个对象并且在 JSON 中找不到,类应该有空 obj

javascript - 使用alasql将多个json对象导出到xlsx文件

javascript - JSON 源引发 500 错误

bash - 代入局部变量时函数的返回值

java - 运行任意版本jar的Shell脚本

javascript - 如何实现水平页面导航系统?

java - 带有 JSON 的 Android POST 请求

bash - 如何在管道后使用反转 grep?

string - .htaccess - 删除/编辑/删除查询字符串参数/标志