jq 中的 use 或运算符

Use or operator in jq

提问人:Max 提问时间:3/4/2023 最后编辑:Max 更新时间:3/4/2023 访问量:132

问:

我正在使用 jq 解析 JSON。JSON 有一个名为“players[]”的数组,其中包含一个键“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 行:

jq '.players[] | if .name | contains( "ZZZ" ) then empty else .name end'

这将返回以下名称:

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

我还想排除包含“失败”或“临时”的名称,它们将返回以下内容:

E180TH-426-CIC-008
LBRTY-185-CIC-005

我试过了

jq '.players[] | if .name | contains( "ZZZ" ) or contains( "Failed" ) then empty else .name end'

但这只排除了包含“ZZZ”的名称。如何过滤掉包含“ZZZ”或“Failed”或“temp”的名称?

数组 if-statement 语法 jq 布尔运算

评论

1赞 pmf 3/4/2023
您的查询应该可以工作,请参阅此演示
0赞 Max 3/4/2023
我有点尴尬:这最终确实奏效了。我忘了稍后在我的代码中对循环进行相同的更改。谢谢。

答:

1赞 pmf 3/4/2023 #1

我会选择(如果它的参数计算结果为 ,即没有匹配项,它会发出),对于正则表达式:selectemptyfalsetest

jq '.players[].name | select(test("ZZZ|temp|Failed") | not) '
"E180TH-426-CIC-008"
"LBRTY-185-CIC-005"

评论

0赞 Max 3/4/2023
好的,我简化了我的问题。真的,我返回了一个不同的键“id”: 然后稍后有代码查找与 id 关联的名称。所以我正在过滤“name”键,但返回“id”键的值。jq '.players[] | if .name | contains( "ZZZ" ) then empty else .id end'
1赞 pmf 3/4/2023
@Max 然后在过滤器内部移动,并改为输出:.nameselect.id.players[] | select(.name | test("ZZZ|temp|Failed") | not).id