如何使用 jq 基于允许列表/阻止列表进行选择

如何使用 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"}]'

预期输出:

{"my_key": "neutral good"}
{"my_key": "good"}

答案1

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

jq  --argjson allowlist "$allowlist" \
    --argjson blocklist "$blocklist" '.[] | 
        select( any ( .my_key ; contains( $allowlist[] ) ) ) | 
        select( all ( .my_key ; contains( $blocklist[] ) | not ) )'

如果您需要使用所有小写字母,请添加到上述过滤器中ascii_downcase的值。my_keycontains

相关内容