代码之家  ›  专栏  ›  技术社区  ›  Myles McDonnell

YML与YQ深度合并

  •  0
  • Myles McDonnell  · 技术社区  · 2 年前

    我需要执行你可能称之为 深度合并 在两个YML文件之间。

    如果有两个匹配的路径,则应聚合子节点,其中包括数组值。在终端节点上存在路径匹配的情况下,第二个文件中的值获胜。

    对于exmaple:

    输入:a.yml

    a:
      a:a
      b:b
    
    b:
      a:a
    

    输入:b.yml

    a:
      a:1
      c:1
    
    c:
      a:1
    

    所需输出:

    a:
      a:1
      b:b
      c:1
    b:
      a:a
    c:
      a:1
    

    我最接近这个使用 yq 是:

    yq eval-all '. as $item ireduce ({}; . *+d $item )' *.yml

    a: a:1 c:1
    b: a:a
    c: a:1
    

    正如你所看到的 a: 分支完全由根替换。

    1 回复  |  直到 2 年前
        1
  •  1
  •   pmf    2 年前

    YAML在 : 使其成为具有键和值的对象。在示例文件中 a.yml 包含

    a:
      a:a
      b:b
    

    的价值 .a 只是字符串 a:a b:b 。没有路径 .a.a .a.b


    添加了必要的空格后,您的尝试将按预期进行(拼写输入文件参数,因为顺序很重要:后者将覆盖前者)。

    yq eval-all '. as $item ireduce ({}; . *+d $item )' a.yml b.yml
    
    a:
      a: 1
      b: b
      c: 1
    b:
      a: a
    c:
      a: 1
    

    使用测试 mikefarah/yq v4.35.1