You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 06:05:22