如何使用yq实现YML文件的Deep Merge(深度合并)?
YAML深度合并的正确yq命令
你之前用的*+d是深度合并数组的操作符,会错误处理对象结构,导致根节点a被异常替换。要实现子节点聚合、终端节点后者优先的深度合并需求,得用递归合并操作符*。
正确命令
yq eval-all '. as $item ireduce ({}; . * $item )' a.yml b.yml
如果是yq v4版本,也可以用简写:
yq ea '. as $item ireduce ({}; . * $item )' *.yml
执行结果
a: a: 1 b: b c: 1 b: a: a c: a: 1
命令说明
eval-all(简写ea):指定yq处理所有输入的YAML文件. as $item ireduce ({}; . * $item ):- 初始化空对象作为合并起始值
- 遍历每个输入文件的内容,递归合并到当前结果中
*操作符会自动处理对象合并:相同路径的终端节点用后一个文件的值覆盖;子对象则聚合双方的所有属性
内容的提问来源于stack exchange,提问作者Myles McDonnell
相关产品推荐
相关产品推荐

