這有點棘手,但可以用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))]'
第一部分對JSON數組從外殼列表:
$ echo "\"$selected_subnets\"" | jq -c -M 'split(" ")'
["valueA","valueB"]
第二部分使用reduce
過濾到.VPCZoneIdentifier
財產與所有元素比較這個數組。隨着selected_subnets_json
變量擴展到它,過濾器如下所示:
.elements = [
.elements[] |
select(.VPCZoneIdentifier as $id |
[ "valueA", "valueB" ] | reduce .[] as $v (false; . or $id == $v))
]
也就是說,在elements
屬性改寫符合選擇標準
.VPCZoneIdentifier as $id | [ "valueA", "valueB" ] | reduce .[] as $v (false; . or $id == $v))
這一點是它的那些元素第一部分記住VPCZoneIdentifier
爲$id
(因爲.
將很快意味着完全不同的東西),並且
[ "valueA", "valueB" ] | reduce .[] as $v (false; . or $id == $v))
是子網陣列的縮減。在這種情況下,它擴大到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))]'
這個工作本質上是相同的方式,除了的$selected_subnets
分離是在線完成的。