を使用して、jq
いくつかのホワイトリスト/ブロックリスト内の各要素キーの包含/除外に基づいて、配列からjson要素をどのように選択できますか?
大文字と小文字を区別しないインクルードを作成したい(したがって、ホワイトリスト/ブロックリストの大文字と小文字は重要ではありません)。
私が試した方法は次のとおりです(ブロックリストは実装されていません)。
allowlist='["happy", "good"]'
blocklist='["sad", "bad"]'
jq --argjson allowlist "$allowlist" \
--argjson blocklist "$blocklist" \
'.[]
| select(.my_key | ascii_downcase
| contains($allowlist[]))' \
<<< '[{"my_key": "neutral"}, {"my_key": "neutral good"},
{"my_key": "neutral bad"}, {"my_key": "good"},
{"my_key": "bad"}, {"my_key": "happy sad bad"},
{"my_key": "neutral happy sad"}]'
予想出力:
{"my_key": "neutral good"}
{"my_key": "good"}
答え1
select
、any
およびを使用すると、all
フィルタは次のように要約されます。
jq --argjson allowlist "$allowlist" \
--argjson blocklist "$blocklist" '.[] |
select( any ( .my_key ; contains( $allowlist[] ) ) ) |
select( all ( .my_key ; contains( $blocklist[] ) | not ) )'
すべて小文字が必要な場合は、上記のascii_downcase
フィルタに値を追加してください。my_key
contains