如何使用 jq 基于许可名单/阻止名单进行选择

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)

Ini*_*ian 5

使用select,anyall,您的过滤器归结为

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