Zet*_*tor 3 text-processing filter jq
使用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"}]'
Run Code Online (Sandbox Code Playgroud)
预期输出:
{"my_key": "neutral good"}
{"my_key": "good"}
Run Code Online (Sandbox Code Playgroud)
使用select,any和all,您的过滤器归结为
jq --argjson allowlist "$allowlist" \
--argjson blocklist "$blocklist" '.[] |
select( any ( .my_key ; contains( $allowlist[] ) ) ) |
select( all ( .my_key ; contains( $blocklist[] ) | not ) )'
Run Code Online (Sandbox Code Playgroud)
如果您需要使用所有小写字母,请添加上述过滤器中ascii_downcase的值。my_keycontains