如何用yq深度合并两个YAML文件 仅新增字段不覆盖原有值
问题根因
你用的*=是a = a * b的简写形式,在主流的mikefarah版yq(v4+)中,*做映射深度合并时,右侧操作数的同名字段会覆盖左侧值。原命令里master的原有项在合并左侧、defaults配置在右侧,自然会出现defaults值覆盖master已有字段的问题,和需求逻辑相反。
正确命令
调换合并顺序即可:把defaults配置放在合并左侧(作为补全值来源),master的原有数组项放在合并右侧(优先级更高,已有值不会被覆盖),命令如下:
yq '.root[] = load("update.yaml").defaults * .' master.yaml
逻辑说明
*对映射类型默认执行递归深度合并,嵌套层级的字段也遵循相同优先级规则- 优先级规则:master中已存在的字段(包括嵌套映射里的键)全部保留,不会被defaults覆盖
- master中缺失的字段(包括嵌套层的缺失键),会自动从defaults中补全
执行后输出的内容和预期结果完全一致(YAML键顺序不影响解析逻辑,若对字段排列顺序有要求可额外追加排序参数调整):
root: - name: First some_value: One one_more: Four elements: first: e second: b third: c other_value: true - name: Second some_value: Two elements: first: a second: b third: c other_value: true one_more: Three
注意:以上命令仅适用于mikefarah发布的yq v4及以上版本,Python版yq语法存在差异。
内容的提问来源于stack exchange,提问作者Marcin
相关产品推荐
相关产品推荐

