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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 20:39:19