我是使用jq的新手,可以使用以下帮助......
本质上,我试图使用bash脚本在文件中“查找并替换”一个json块。
我有一个名为docs.json的文件,我在其中检索了一组doc条目:
{
"number_of_docs": "1000",
"docs": [{
{
"_id": "000001",
"_rev": "0",
"_content": "abcdefg"
},
{
"_id": "000002",
"_rev": "0",
"_content": "hijklmn",
"_attachments": {
"image1.png": {
"content_type": "image/png"
...
}
}
},
{
"_id": "000003",
"_rev": "0",
"_content": "opqrstuv"
}]
}
我正在尝试用一个名为“doc”的变量存储的新json块替换所有具有“_attachments”的doc条目(整个块,而不仅仅是键的值): / p>
{
"_id": "000002_masked",
"_rev": "0",
"_content": "[Document content has been masked for confidentiality.]",
"_attachments": {
"confidential.png": {
"content_type": "image/png"
...
}
}
}
我正在尝试使用jq并在bash脚本中运行吗?
提前感谢您的帮助和提示。
答案 0 :(得分:2)
关键是选择包含_attachments
密钥的文档,然后将其替换为|=
运算符。
jq --argjson new "$doc" '(.docs[]| select(has("_attachments"))) |= $new' docs.json
--argjson
用于将$doc
的值作为原始JSON值传递到过滤器中。
答案 1 :(得分:0)
如果您无法使用--argjson
,可以使用-s
slurp选项以及
.[0] as $new
| .[1]
| ( .docs[] | select(has("_attachments")) ) = $new
如果以上内容位于filter.jq
,则new.json
中的新文档和您的数据包含您在docs.json
中描述的单个对象
jq -M -s -f filter.jq new.json docs.json
将产生
{
"number_of_docs": "1000",
"docs": [
{
"_id": "000001",
"_rev": "0",
"_content": "abcdefg"
},
{
"_id": "000002_masked",
"_rev": "0",
"_content": "[Document content has been masked for confidentiality.]",
"_attachments": {
"confidential.png": {
"content_type": "image/png"
}
}
},
{
"_id": "000003",
"_rev": "0",
"_content": "opqrstuv"
}
]
}
注意 - 我没有jq-1.3所以我只能用jq-1.5验证这个,但我相信这应该适用于jq-1.3