美文网首页
jq修改数组中满足条件的成员的值

jq修改数组中满足条件的成员的值

作者: CodingCode | 来源:发表于2021-01-30 01:58 被阅读0次
  1. 修改数组域值

假设已知json定义:

$ cat addr.json
[
  {
    "id": "user0",
    "type": "user",
    "phone": "123",
    "addr": "home address 0"
  },
  {
    "id": "user1",
    "type": "user",
    "phone": "456",
    "addr": "home address 1"
  }
]

如何把id=user1的addr改掉呢。

$ jq \
    --arg newaddr "the newaddr" \
    '. = [.[] | if (.id == "user1") then (.addr = $newaddr ) else . end]' \
    addr.json

运行结果是:

[
  {
    "id": "user0",
    "type": "user",
    "phone": "123",
    "addr": "home address 0"
  },
  {
    "id": "user1",
    "type": "user",
    "phone": "456",
    "addr": "the newaddr"
  }
]
  1. 一次修改多个域值
jq --arg newaddr "${NEWADDR}" \
   --arg newphone "${NEWPHONE}" \
   '. = [.[] | if (.id == "user0") then
                  .addr = $newaddr |
                  .phone = "tcl://" + $newphone
               elif (.id == "user1" or .type == "manager") then
                  .phone = "<invalid>"
               else
                  .
               end
        ]' addr.json
  1. 修改的数组不是一个顶级域
$ cat addr.json
{
  "division": {
    "groups": {
      "people": [
        {
          "id": "user0",
          "type": "user",
          "phone": "123",
          "addr": "home address 0"
        },
        {
          "id": "user1",
          "type": "user",
          "phone": "456",
          "addr": "home address 1"
        }
      ]
    }
  }
}

命令格式如下:

$ jq \
    --arg newaddr "the newaddr" \
    '.division.groups.people = [.division.groups.people[] | if (.id == "user1") then (.addr = $newaddr ) else . end]' \
   addr.json

相关文章

网友评论

      本文标题:jq修改数组中满足条件的成员的值

      本文链接:https://www.haomeiwen.com/subject/wvkhtltx.html