これは少しトリッキーですが、 で実行できます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"]
2 番目の部分では、フィルターを使用して、プロパティをこの配列のすべての要素と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
as を覚えています$id
(なぜなら、.
すぐにまったく別の意味になるからです)。
[ "valueA", "valueB" ] | reduce .[] as $v (false; . or $id == $v))
サブネット配列の or-reduction です。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
インラインで行われることを除いて、基本的に同じように機能します。