jq - 如何使用 |= 运算符?

4
JQ手册中,有一个Update-assignment: |= 过滤器及其示例。
jq '(..|select(type=="boolean")) |= if . then 1 else 0 end'
Input   [true,false,[5,true,[true,[false]],false]]
Output  [1,0,[5,1,[1,[0]],0]]

为什么以下代码没有生成JSON流,而是保留了原始的嵌套列表格式?
1
0
1
1
0
0

对我来说,(..|select(type=="boolean"))会产生:

true
false
true
true
false
false

那么应用 |= if . then 1 else 0 end 就不会产生这样的结果?

1
0
1
1
0
0

请帮助理解位或(**|=**)操作如何维护输入的格式。
2个回答

2
|=的右侧,.并不是指左侧输出的每个布尔值,而是指向左侧产生的每个值的路径。
对于给定的输入,过滤器(..|select(type=="boolean")) |= if . then 1 else 0 end等同于:
.[0] |= if . then 1 else 0 end | 
.[1] |= if . then 1 else 0 end |
.[2][0] |= if . then 1 else 0 end | ...

谢谢你的回答。所以点(.)既可以表示JSON路径,也可以表示JSON元素,这一点我之前并不知道。 - mon

2
任何赋值操作,无论是通过=|=还是其他方式,都不会改变上下文的结果。它只是更新所选的值并传递原始.输入。正如chepner指出的那样,展开的表达式只是一系列赋值操作,其中没有一个会改变上下文。
如果您想获取映射出的值,您不应该在这里进行赋值操作,而应该执行常规管道操作。
.. | select(type=="boolean") | if . then 1 else 0 end

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接