jq数组过滤器:为匹配NP01-RW组的嵌套数组添加用户并返回完整JSON
解决jq修改指定组的policyItems并返回完整JSON的问题
问题说明
需要在给定JSON结构中,找到包含NP01-RW组的policyItems对象,为其users数组添加新用户,同时返回完整的JSON结构。此前尝试的jq命令仅返回匹配的部分片段,无法保留原JSON的完整结构,尝试的命令如下:
jq --arg username "$sync_userName" '.policyItems[] | select(.groups[] | IN("NP01-RO")).users += [$username]' > ${sync_policyName}.json
解决方案
使用|=操作符替代管道符|来修改原数组,确保完整JSON结构被保留。正确的jq命令如下:
jq --arg username "$sync_userName" '.policyItems |= map(select(.groups[] | IN("NP01-RW")) |= .users += [$username])' > ${sync_policyName}.json
命令解释
.policyItems |= ...:将修改后的policyItems数组赋值回原字段,确保整个JSON结构不变map(...):遍历policyItems中的每个对象select(.groups[] | IN("NP01-RW")):筛选出包含NP01-RW组的对象(注意修正了原命令中组名写错的问题,原命令误写为NP01-RO)|= .users += [$username]:对筛选出的对象,将新用户追加到users数组中
示例验证
假设原始JSON为:
{ "policyName": "example-policy", "policyItems": [ { "groups": ["NP01-RW", "ADMIN"], "users": ["alice", "bob"] }, { "groups": ["NP01-RO"], "users": ["charlie"] } ] }
执行命令(假设$sync_userName为dave)后,输出的完整JSON会变为:
{ "policyName": "example-policy", "policyItems": [ { "groups": ["NP01-RW", "ADMIN"], "users": ["alice", "bob", "dave"] }, { "groups": ["NP01-RO"], "users": ["charlie"] } ] }
内容的提问来源于stack exchange,提问作者girish chalke
相关产品推荐
相关产品推荐

