You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 23:20:21