如何在jq中使用OR运算符过滤排除指定关键词的players.name字段
用jq过滤排除含指定关键词的数组元素
我有一个包含players[]数组的JSON,其中name字段的示例值如下:
ZZZ-104TH-082-ADV-004 ZZZ-149TH-435-ADV-WL-006 GDS-123-CIC-007_temp-blocked LRMR-121-CIC-002_temp-removed NOS-343-CIC-003_Failed E180TH-426-CIC-008 LBRTY-185-CIC-005
现有jq语句能排除包含"ZZZ"的name:
jq '.players[] | if .name | contains( "ZZZ" ) then empty else .name end'
但我需要同时排除包含"ZZZ"、"Failed"或"temp"的name,预期结果为:
E180TH-426-CIC-008 LBRTY-185-CIC-005
尝试了以下语句但仅能排除含"ZZZ"的元素:
jq '.players[] | if .name | contains( "ZZZ" ) or contains( "Failed" ) then empty else .name end'
问题原因
之前的写法逻辑错误:.name | contains("ZZZ") or contains("Failed")中,contains("Failed")是作用在contains("ZZZ")返回的布尔值上,而非.name本身。布尔值不可能包含字符串"Failed",所以这个条件等价于(是否含ZZZ) or false,自然只有ZZZ被排除。
正确解决方案
方案1:明确每个条件都作用于.name
jq '.players[] | if .name | contains("ZZZ") or .name | contains("Failed") or .name | contains("temp") then empty else .name end'
方案2:用select结合not简化写法
jq '.players[].name | select(contains("ZZZ") | not) | select(contains("Failed") | not) | select(contains("temp") | not)'
方案3:用any批量检查关键词(最简洁)
jq '.players[] | select(.name | any(["ZZZ", "Failed", "temp"]; contains(.)) | not) | .name'
以上三种写法都能得到预期的过滤结果。
内容的提问来源于stack exchange,提问作者Max
相关产品推荐
相关产品推荐

