我正在尝试将以下 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
}
]
}
关于dictionary - jq 将 value 替换为 map 并根据两个条件在列表中进行选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/77319427/