使用 jq 编辑子 JSON 元素值

使用 jq 编辑子 JSON 元素值

我正在尝试使用 jq 来更改孩子的价值。例如,我想将“test2”的值从[“yo”,“bye”]更改为[“hi”]。

{
   "title": "hello",
   "body": {
       "test1": 123,
       "test2": [
           "yo",
           "bye"  
       ]
   }
}

到目前为止,我只能更改根的子键的值。我不知道如何接受这个并转到 .body.test2 而不是标题:

cat test.conf | jq 'to_entries | map(if .key == "title" then . + {"value":"hello world"} else . end) | from_entries' > test2.conf

答案1

(发帖@格伦杰克曼评论作为社区答案,以防止系统自动删除问题)

jq '.body.test2 = ["hi"]'会做的

答案2

命令

jq '.body.test2 = ["hi"]' test.conf >test2.conf

...会这样做,但假设您可能希望更好地控制操作,而不必对test2键名称和要添加的文本进行硬编码:

printf '%s\n' "line 1" "line 2" "line 3" |
jq -SR . |
jq --arg section test2 '.body[$section] = [inputs]' test.conf - >test2.conf

这需要任意文本行(示例中为三行,但理论上,您可以cat在此处获取文本文档或直接将文本文档作为参数传递给以下jq命令),并使用jq -SR ..然后,管道将它们传递给第二次jq调用,该调用将它们作为数组插入到body键下的正确部分下。

-在最终调用中用作第二个输入文件名jq会导致实用程序插入标准输入流中的 JSON 字符串来代替表达式inputs中的位置jq

给定问题中的文档,上述管道将在 中生成以下 JSON 文档test2.conf

{
  "title": "hello",
  "body": {
    "test1": 123,
    "test2": [
      "line 1",
      "line 2",
      "line 3"
    ]
  }
}

相关内容