3

jq1.4を使用しています。私の$selected_subnets(bash変数)にVPCZoneIdentifierが存在するときに要素を選択しようとしています。

selected_subnets="valueA valueB"

input='{"elements":[
           {"name": "nameA", "VPCZoneIdentifier": "valueA"}, 
           {"name": "nameB", "VPCZoneIdentifier": "valueB"}, 
           {"name": "nameC", "VPCZoneIdentifier": "valueC"}
       ]}'

testおよびmatchfn は v1.5 でのみ使用できます。

4

2 に答える 2

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))]'

最初の部分は、シェル リストから 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))

このうち最初の部分はVPCZoneIdentifieras を覚えています$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インラインで行われることを除いて、基本的に同じように機能します。

于 2015-03-19T12:24:16.750 に答える
4

オプションを使用して、コマンド ラインから変数をクエリで使用できるように設定でき--argます。その後、フィルタを使用して要素をselect除外できます。値の配列を指定すると"value in array"、次のようなテストを実行できます。

value == (array[])

したがって、フィルターは次の構造になります。

.elements | map(
    select(
        .VPCZoneIdentifier == ($subnets | split(" ")[])
    )
)

すべてを変数と一緒にまとめる:

$ echo $input | jq --arg subnets "$selected_subnets" '.elements | map(select(.VPCZoneIdentifier == ($subnets | split(" ")[])))'
[
  {
    "name": "nameA",
    "VPCZoneIdentifier": "valueA"
  },
  {
    "name": "nameB",
    "VPCZoneIdentifier": "valueB"
  }
]
于 2015-03-20T01:42:09.917 に答える