如何使用YQ将file2.yaml列表替换到file1.yaml并保留缩进格式?
解决YQ替换YAML节点时的缩进格式问题
要实现用file2.yaml中app.list-data的列表替换file1.yaml里default.app.service-v1.country.list的LIST_TO_REPLACE值,同时保持file1原有的缩进格式,用mikefarah/yq(当前主流版本)可以直接通过赋值命令自动适配缩进,以下是具体方案:
方法一:直接赋值(推荐)
执行这条命令,yq会自动继承目标节点的缩进层级,无需手动调整格式:
yq eval '.default.app.service-v1.country.list = load("file2.yaml").app.list-data' file1.yaml > output.yaml
方法二:清空后追加(适配复杂场景)
如果直接赋值出现异常,可以先将目标节点置空,再追加file2的列表数据,同样会自动匹配原文件缩进:
yq eval ' .default.app.service-v1.country.list = [] | .default.app.service-v1.country.list += load("file2.yaml").app.list-data ' file1.yaml > output.yaml
验证结果
执行命令后,output.yaml的格式会和你预期的一致:
default: app: service-v1: country: list: - key1: value key2: value key3: - list1 - list2 - list3 - key4: value key5: value key6: - list1 - list2 - list3
注意:如果使用的是旧版本yq(如kislyuk/yq),语法会有差异,建议升级到mikefarah/yq最新版,它对YAML格式的兼容性和自动缩进处理更完善。
内容的提问来源于stack exchange,提问作者Avinash Mishra
相关产品推荐
相关产品推荐

