使用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