【发布时间】:2017-06-15 08:56:56
【问题描述】:
在 jq 中,我可以很容易地在列表中选择一个项目:
$ 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")。然后应该很清楚发生了什么。 -
感谢@JeffMercado 的解释。我不知道为什么它不起作用。本质上,
. != ("a","c")是逻辑 OR,我期待的是逻辑 AND(即使. == ("a","c")是逻辑 OR)。 -
并非如此。这更像是
("a","c")是两个值"a"和"c"。对于使用它的任何表达式,复制表达式,用值"a"和"c"替换副本。
标签: arrays json select jq blacklist