dictionary - jq 将 value 替换为 map 并根据两个条件在列表中进行选择

标签 dictionary select replace jq

我正在尝试将以下 json 文件中的插件“oauth2”内的“check-api”值替换为“xxxxxx”:

{
  "consumers": [
    {
      "username": "api-user2"
    },
    {
      "username": "oauth2-devops-app"
    }
  ],
  "services": [
    {
      "name": "check-api",
      "plugins": [
        {
          "config": {
            "allow": [
              "acl-devops"
            ],
            "deny": null,
            "hide_groups_header": false
          },
          "name": "acl"
        },
        {
          "config": {
            "credentials": false,
            "preflight_continue": false
          },
          "enabled": true,
          "name": "cors"
        },
        {
          "config": {
            "provision_key": "data-omitted",
            "token_expiration": 300
          },
          "enabled": true,
          "name": "oauth2"
        }
      ],
      "port": 5000,
      "write_timeout": 60000
    },
    {
      "name": "check-api2",
      "plugins": [
        {
          "config": {
            "deny": null,
            "hide_groups_header": false
          },
          "enabled": true,
          "name": "acl"
        },
        {
          "config": {
            "credentials": false,
            "preflight_continue": false
          },
          "enabled": true,
          "name": "oauth2"
        }
      ],
      "port": 5000,
      "write_timeout": 60000
    }
  ]
}

我正在尝试且最接近我的目标的 jq 句子如下:

cat file.json | jq '.services |= map_values(select(.name == "check-api" and .plugins[].name == "oauth2").plugins[].config.provision_key |= "xxxxxx")'

但结果会插入该服务的所有插件名称中:

{
  "consumers": [
    {
      "username": "api-user2"
    },
    {
      "username": "oauth2-devops-app"
    }
  ],
  "services": [
    {
      "name": "check-api",
      "plugins": [
        {
          "config": {
            "allow": [
              "acl-devops"
            ],
            "deny": null,
            "hide_groups_header": false,
            "provision_key": "xxxxxx"
          },
          "name": "acl"
        },
        {
          "config": {
            "credentials": false,
            "preflight_continue": false,
            "provision_key": "xxxxxx"
          },
          "enabled": true,
          "name": "cors"
        },
        {
          "config": {
            "provision_key": "xxxxxx",
            "token_expiration": 300
          },
          "enabled": true,
          "name": "oauth2"
        }
      ],
      "port": 5000,
      "write_timeout": 60000
    },
    {
      "name": "check-api2",
      "plugins": [
        {
          "config": {
            "deny": null,
            "hide_groups_header": false
          },
          "enabled": true,
          "name": "acl"
        },
        {
          "config": {
            "credentials": false,
            "preflight_continue": false
          },
          "enabled": true,
          "name": "oauth2"
        }
      ],
      "port": 5000,
      "write_timeout": 60000
    }
  ]
}

如何基于元素列表选择两个条件? 任何评论表示赞赏。提前致谢。

最佳答案

使用作业左侧的选择过滤器:

( .services[]
  | select(.name == "check-api").plugins[]
  | select(.name == "oauth2").config.provision_key
) = "xxxxxx"
{
  "consumers": [
    {
      "username": "api-user2"
    },
    {
      "username": "oauth2-devops-app"
    }
  ],
  "services": [
    {
      "name": "check-api",
      "plugins": [
        {
          "config": {
            "allow": [
              "acl-devops"
            ],
            "deny": null,
            "hide_groups_header": false
          },
          "name": "acl"
        },
        {
          "config": {
            "credentials": false,
            "preflight_continue": false
          },
          "enabled": true,
          "name": "cors"
        },
        {
          "config": {
            "provision_key": "xxxxxx",
            "token_expiration": 300
          },
          "enabled": true,
          "name": "oauth2"
        }
      ],
      "port": 5000,
      "write_timeout": 60000
    },
    {
      "name": "check-api2",
      "plugins": [
        {
          "config": {
            "deny": null,
            "hide_groups_header": false
          },
          "enabled": true,
          "name": "acl"
        },
        {
          "config": {
            "credentials": false,
            "preflight_continue": false
          },
          "enabled": true,
          "name": "oauth2"
        }
      ],
      "port": 5000,
      "write_timeout": 60000
    }
  ]
}

Demo

关于dictionary - jq 将 value 替换为 map 并根据两个条件在列表中进行选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/77319427/

相关文章:

arrays - 按数字过滤 Matlab 元胞数组会留下虚假错误

SQL - 删除所有重复项,但每个用户 ID 的每个组中最高的

c - Linux select() 不阻塞

java - 字符数组列表,仅替换字符

SQL 更新替换语句

Python:替换函数以编辑文件

javascript - D3 畅国飘

python - 如何将此 JSON 放入 python 列表或字典中?

python - 如何检索字典中键控项的子值?

Python 面向对象 : functions from a dictionary do not affect class instance variables