使用 JQ 1.5 我在理解特定情况下替代运算符
//
的输出时遇到问题。
鉴于此输入:
{
"a": 42,
"b": false,
"c": null
}
我期望表达式
(.a, .b, .c, .d) // -1
返回这个:
42
-1
-1
-1
但实际上它返回的是这个:
42
如果我将
//
替换为 <
等另一个运算符,那么我确实会得到四个结果,而不是只有一个(实际结果在这里并不重要,只是它们的数量):
> jq '(.a, .b, .c, .d) < -1' input.json
false
true
true
true
注意: 表达式
(.a, .b, .c, .d) | . // -1
返回预期输出。这不是问题。我想知道为什么初始表达式不起作用。
坦率地说,1.5 文档是错误的。
jq FAQ 提供了这个简洁且有用的总结:
"A // B" either produces the truthy elements of A if there are any,
or else the entire stream B.
在发布我的问题后,我偶然发现了开发人员版本手册中的确切答案。 :耸肩:
到目前为止,jq 1.5的手册页介绍了
//
:
如果 a 产生除
和a // b
以外的结果,a
形式的过滤器会产生与false
相同的结果。否则,null
会产生与a // b
相同的结果。b
开发者版本还说:
[...]注意:
与some_generator // defaults_here
不同。后者将为左侧的所有非some_generator | . // defaults_here
、非false
值生成默认值,而前者则不会。 [...] 在null
中,(false, null, 1) | . // 42
的左侧是//
,它总是只产生一个值,而在.
中,左侧是三个值的生成器,并且因为它产生其他(false, null, 1) // 42
和false
的值,不产生默认的null
。42