yq4中实现yq3多文档YAML原地编辑的等价命令
多文档YAML文件的yq4原地编辑问题
我有一个包含2个文档的YAML文件template.yaml,内容如下:
# template.yaml a : 1 --- b : 2
我尝试用yq4命令原地编辑该文件,执行的命令如下:
# yq4 yq -i ' select(documentIndex == 0) | .a = 3 | select(documentIndex == 1) | .b = 4 ' template.yaml
执行后文件变成了空文件,排查后发现原因是:select(documentIndex == 0) | .a = 3的输出仅为第一个文档,再通过管道传递给select(documentIndex == 1)时,会筛选出空结果,最终导致文件被清空。
在yq3中,我可以通过以下命令实现需求:
# yq3 yq w -d1 .a 3 | yq w -d2 .b 4 > template.yaml
请问在yq4中有没有等价于该yq3命令的正确写法?
yq4的正确实现方式
要在yq4里完成多文档YAML的原地修改,别用你之前那种连续select的写法,那样会丢掉其他文档。正确的做法是把筛选和赋值结合起来,保留所有文档结构,命令如下:
yq -i ' (select(documentIndex == 0) | .a) = 3 | (select(documentIndex == 1) | .b) = 4 ' template.yaml
原理说明
这种写法是把赋值操作直接作用在括号内的筛选结果上,而不是通过管道过滤掉其他文档。括号里的select只会定位到目标文档修改对应字段,其他文档会原封不动保留,自然就不会生成空文件了。
嫌上面的写法麻烦?还有更简洁的索引语法:
yq -i ' .[0].a = 3 | .[1].b = 4 ' template.yaml
yq4里可以把多文档当成数组,.0对应第一个文档,.1对应第二个文档,直接用索引定位修改就行。
内容的提问来源于stack exchange,提问作者Anugerah Erlaut
相关产品推荐
相关产品推荐

