JQ 如何在更新选定对象的同时打印出整个 JSON 文档

JQ How to update selected objects while also printing out the entire JSON document

我正在尝试简单地更新一个数组,同时还打印出完整的 JSON 正文。每当我更新数组时,我只能输出我更新的 JSON 对象,而不是打印整个 JSON 文档,加上更新。

命令:

array='{"uid": "foo123" }, {"uid": "bar123"}'
t=Test

jq --arg title "$t" --arg array "[$array]" \
  '. | select(.data[].title == $title) | .alert.notifications = ($array | fromjson)'

输入:

{
  "data": [
    {
      "alert": {
        "notifications": [
          {
            "uid": "foo"
          },
          {
            "uid": "bar"
          }
        ]
      },
      "title": "Test"
    },
    {
      "alert": {
        "notifications": [
          {
            "uid": "foo1"
          },
          {
            "uid": "bar1"
          }
        ]
      },
      "title": "Test2"
    }
  ]
}

不需要的输出:

{
  "data": [
    {
      "alert": {
        "notifications": [
          {
            "uid": "foo"
          },
          {
            "uid": "bar"
          }
        ]
      },
      "title": "Test"
    },
    {
      "alert": {
        "notifications": [
          {
            "uid": "foo1"
          },
          {
            "uid": "bar1"
          }
        ]
      },
      "title": "Test2"
    }
  ],
  "alert": {
    "notifications": [
      {
        "uid": "foo123"
      },
      {
        "uid": "bar123"
      }
    ]
  }
}

期望的输出:

{
  "data": [
    {
      "alert": {
        "notifications": [
          {
            "uid": "foo123"
          },
          {
            "uid": "bar123"
          }
        ]
      },
      "title": "Test"
    },
    {
      "alert": {
        "notifications": [
          {
            "uid": "foo1"
          },
          {
            "uid": "bar1"
          }
        ]
      },
      "title": "Test2"
    }
  ]
}

我尝试了几种不同的场景,最接近的是不想要的输出。任何帮助将不胜感激!

谢谢,

尝试用 map:

更新 |= data 字段
array='{"uid": "foo123" }, {"uid": "bar123"}'
t=Test

jq --arg title "$t" --arg array "[$array]" \
  '.data |= map(select(.title == $title).alert.notifications = ($array | fromjson))'

或者,将分配的 LHS 括在括号中以保留上下文:

array='{"uid": "foo123" }, {"uid": "bar123"}'
t=Test

jq --arg title "$t" --arg array "[$array]" \
  '(.data[] | select(.title == $title).alert.notifications) = ($array | fromjson)'

反正没必要.|.