我一直在试着理解jq
,下面的迷思让我头疼:我可以构造两个表达式,A
和B
,它们似乎产生相同的输出。然而,当我用[]
数组构造大括号(如[A]
和[B]
)包围它们时,它们会产生不同的输出。在这种情况下,表达式如下:
A := jq '. | add'
B := jq -s `.[] | add`
具体而言:
$ echo '[1,2] [3,4]' | jq '.'
[1,2]
[3,4]
$ echo '[1,2] [3,4]' | jq '. | add'
3
7
# Now surround with array construction and we get two values:
$ echo '[1,2] [3,4]' | jq '[. | add]'
[3]
[7]
$ echo '[1,2] [3,4]' | jq -s '.[]'
[1,2]
[3,4]
$ echo '[1,2] [3,4]' | jq -s '.[] | add'
3
7
# Now surround with array construction and we get only one value:
$ echo '[1,2] [3,4]' | jq -s '[.[] | add]'
[3,7]
这里发生什么事情?为什么应用B
设置但似乎产生与A
表达式相同的中间输出的--slurp
表达式在被[]
数组构造括号包围时产生不同的输出?
发布于 2022-04-26 19:44:55
当jq
被输入一个流时,就像两个输入的[1,2] [3,4]
一样,它对每个流独立地执行过滤器。这就是为什么jq '[. | add]'
将产生两个结果;每个添加将分别包装到一个数组中。
当jq
被赋予--slurp
选项时,它将流组合到一个数组中,只提供一个输入。因此,jq -s '[.[] | add]'
将只有一个结果;数组构造函数将捕获多个加法,只执行一次。
https://stackoverflow.com/questions/72019546
复制相似问题