如何合并两个.yaml文件?指定层级共享键保留指定文件值
合并YAML文件并实现指定键的覆盖规则
你需要的这种合并逻辑,mikefarah/yq(v4版本)完全可以实现,这是目前最常用的YAML处理工具之一。
需求回顾
- 顶层键(如
name):直接用file2.yaml的值覆盖file1.yaml paths下的子键:同名键用file2.yaml的值替换,非同名键保留file1.yaml的内容
示例文件
file1.yaml
name: 'file1' paths: path1: content: "t" path2: content: "b"
file2.yaml
name: 'file2' paths: path1: value: "t"
实现命令
在终端执行以下命令即可生成目标file3.yaml:
yq eval-all '. as $item ireduce ({}; . * $item | .paths = $item.paths * .paths)' file1.yaml file2.yaml > file3.yaml
命令解释
eval-all:处理多个输入文件. as $item ireduce ({}; ...):遍历所有输入文件,逐步合并到初始空对象. * $item:先做全局深度合并,顶层键自动用后文件覆盖前文件(比如name会被file2的值替换).paths = $item.paths * .paths:单独对paths键做反向合并——用当前遍历到的文件(这里是file2)的paths子键覆盖之前合并结果中的同名子键,同时保留file1中独有的paths子键
合并结果(file3.yaml)
name: 'file2' paths: path1: value: "t" path2: content: "b"
内容的提问来源于stack exchange,提问作者William Jiang
相关产品推荐
相关产品推荐

