json - 修改JSON jq中的键值数组

标签 json shell command-line edit jq

以防万一,我的原始 json 如下所示:

{
  "taskDefinition": {
    "containerDefinitions": [
      {
        "name": "web",
        "image": "my-image",
        "environment": [
          {
            "name": "DB_HOST",
            "value": "localhost"
          },
          {
            "name": "DB_USERNAME",
            "value": "user"
          }
        ]
      }
    ]
  }
}

我想就地修改匹配键的值,如下所示:

jq '.taskDefinition.containerDefinitions[0].environment[] |选择(.name==“DB_USERNAME”)| .value="new"' json

我得到了输出

{
  "name": "DB_USERNAME",
  "value": "new"
}

但我想要更多的像就地修改或原始的整个 json 并修改新值,如下所示:

{
      "taskDefinition": {
        "containerDefinitions": [
          {
            "name": "web",
            "image": "my-image",
            "environment": [
              {
                "name": "DB_HOST",
                "value": "localhost"
              },
              {
                "name": "DB_USERNAME",
                "value": "new"
              }
            ]
          }
        ]
      }
    }

是否可以使用jq或任何已知的解决方法?

谢谢。

已更新

对于任何想要编辑多值的人来说, 这是我使用的方法

JQ=""
for e in DB_HOST=rds DB_USERNAME=xxx; do
    k=${e%=*}
    v=${e##*=}
    JQ+="(.taskDefinition.containerDefinitions[0].environment[] | select(.name==\"$k\") | .value) |= \"$v\" | "
done

jq '${JQ%??}' json

我认为应该有更简洁的方法,但这似乎工作正常。

最佳答案

如果您使用|=,则分配给路径就足够了,例如

jq '
  (.taskDefinition.containerDefinitions[0].environment[] | 
   select(.name=="DB_USERNAME") | .value) |= "new"
' infile.json

输出:

{
  "taskDefinition": {
    "containerDefinitions": [
      {
        "name": "web",
        "image": "my-image",
        "environment": [
          {
            "name": "DB_HOST",
            "value": "localhost"
          },
          {
            "name": "DB_USERNAME",
            "value": "new"
          }
        ]
      }
    ]
  }
}

关于json - 修改JSON jq中的键值数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54039268/

相关文章:

javascript - jquery数据不解析值html5数据自定义属性

java - jquery 在 post 请求上发送表单数据,但是当我修改 servlet 以返回 json 并修改 jquery 以接受 json servlet 时未接收 null

linux - 带变量的 Shell 脚本更改目录

Bash 脚本 : Can you make a function call itself?

python - 如何有效地构造一个要从命令行部分运行的 python 脚本?

PHP 调用另一个 PHP 页面进行 MySQL 查询(返回 JSON 数据)

javascript - 我如何只对 Javascript 对象的一部分进行 JSON 编码?

linux - 如何从脚本(csh/tcsh)调用 ssh?

regex - 合并两个 sed 命令

version-control - 在 Perforce 中,切换客户端用户时连接到不同端口的命令是什么?