我正在尝试使用 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"
]
}
}