在jq中,我可以相对轻松地选择列表中的一个项:
In jq中,我可以相对轻松地选择一个列表中的项:in
$ echo '["a","b","c","d","e"]' | jq '.[] | select(. == ("a","c"))'
如果您更喜欢将其作为数组获取:
$ echo '["a","b","c","d","e"]' | jq 'map(select(. == ("a","c")))'
但是我要如何选择不在列表中的所有项目?当然,. != ("a","c")
并不起作用:
$ echo '["a","b","c","d","e"]' | jq 'map(select(. != ("a","c")))'
[
"a",
"b",
"b",
"c",
"d",
"d",
"e",
"e"
]
上述内容除了"a"
和"c"
之外,每个项都出现两次。
同理适用于:
$ echo '["a","b","c","d","e"]' | jq '.[] | select(. != ("a","c"))'
"a"
"b"
"b"
"c"
"d"
"d"
"e"
"e"
如何过滤掉匹配的项?
. != "a" or . != "c"
相同。当然,这总是为真,所以你没有看到任何被过滤的内容。但是,由于你使用了逗号运算符,现在你会得到重复的值。请记住,对于从逗号产生的每个值,表达式都将重新计算新值。因此,select(. != ("a","c"))
变成了select(. != "a"), select(. != "c")
。那么现在应该很清楚发生了什么。 - Jeff Mercado. != ("a","c")
是逻辑或,而我期望的是逻辑与(即使. == ("a","c")
是逻辑或)。 - deitch("a","c")
是两个值"a"
和"c"
。对于使用它的任何表达式,复制该表达式并将值"a"
和"c"
替换为副本。 - Jeff Mercado