mru*_*lan 3 bash amazon-ec2 vpc jq
我正在使用 jq 1.4。当我的$selected_subnets(bash 变量)中存在 VPCZoneIdentifier 时,我尝试选择元素。
selected_subnets="valueA valueB"
input='{"elements":[
{"name": "nameA", "VPCZoneIdentifier": "valueA"},
{"name": "nameB", "VPCZoneIdentifier": "valueB"},
{"name": "nameC", "VPCZoneIdentifier": "valueC"}
]}'
Run Code Online (Sandbox Code Playgroud)
test和matchfn 仅在 v1.5 上可用。
这有点棘手,但可以使用reduce. 整个事情可能是这样的:
selected_subnets_json=$(echo "\"$selected_subnets\"" | jq -c -M 'split(" ")')
echo "$input" | jq -M '.elements = [.elements[] | select(.VPCZoneIdentifier as $id | '"$selected_subnets_json"' | reduce .[] as $v (false; . or $id == $v))]'
Run Code Online (Sandbox Code Playgroud)
第一部分从 shell 列表生成一个 JSON 数组:
$ echo "\"$selected_subnets\"" | jq -c -M 'split(" ")'
["valueA","valueB"]
Run Code Online (Sandbox Code Playgroud)
第二部分使用reduce过滤器将.VPCZoneIdentifier属性与该数组的所有元素进行比较。将selected_subnets_json变量扩展到其中后,过滤器如下所示:
.elements = [
.elements[] |
select(.VPCZoneIdentifier as $id |
[ "valueA", "valueB" ] | reduce .[] as $v (false; . or $id == $v))
]
Run Code Online (Sandbox Code Playgroud)
也就是说,该elements属性会被它的那些符合选择标准的元素覆盖
.VPCZoneIdentifier as $id | [ "valueA", "valueB" ] | reduce .[] as $v (false; . or $id == $v))
Run Code Online (Sandbox Code Playgroud)
其中第一部分记住了VPCZoneIdentifieras $id(因为.很快就会意味着完全不同的东西),并且
[ "valueA", "valueB" ] | reduce .[] as $v (false; . or $id == $v))
Run Code Online (Sandbox Code Playgroud)
是子网数组的或约简。false or $id == "valueA" or $id == "valueB"在这种情况下它扩展到。
如果您更喜欢一次性完成所有操作,您可以写
echo "$input" | jq -M '.elements = [.elements[] | select(.VPCZoneIdentifier as $id | ("'"$selected_subnets"'" | split(" ")) | reduce .[] as $v (false; . or $id == $v))]'
Run Code Online (Sandbox Code Playgroud)
这基本上以相同的方式工作,除了 的拆分$selected_subnets是内联完成的。