jq中Update-assignment赋值empty仅删除首个路径的疑问
jq 1.6中
.[] |= empty仅删除首个元素的问题分析 这是jq 1.6版本的特定行为,并非你对语法的理解错误,该问题在后续的jq 1.7版本中已经被修复。
原因说明
在jq 1.6的实现逻辑里,当使用|=将empty赋值给数组的每个元素(.[] |= empty)时,empty会终止当前的迭代上下文——处理完第一个元素后,迭代就直接停止了,导致后续元素没有被处理。
而另外两种操作的逻辑不同:
del(.[])是专门的批量删除操作,会遍历数组的所有元素并执行删除,不受empty的上下文终止影响;- 赋值普通值(比如
.[] |= 0)时,不会触发迭代终止的逻辑,因此能正常遍历所有元素完成赋值。
验证示例(jq 1.7中已修复)
如果升级到jq 1.7,执行同样的命令会得到预期结果:
$ jq --version jq-1.7 $ echo '[1, 2]' | jq -c '.[] |= empty' []
临时解决方案(针对jq 1.6)
如果无法升级版本,可改用del(.[])来实现批量删除数组元素的需求,或者用等价的遍历写法:
echo '[1, 2]' | jq -c 'map(empty)'
内容的提问来源于stack exchange,提问作者LHMathies
相关产品推荐
相关产品推荐

