使用jq查找并替换文件中的json

时间:2016-07-19 19:29:16

标签: json bash jq

我是使用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脚本中运行吗?

提前感谢您的帮助和提示。

2 个答案:

答案 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