连接数组时合并两个 yaml 文档

Merging two yaml documents while concatenating arrays

我想合并两个yaml文档,结果包含

例如给出这个文件

# file1.yml
animals:
  - elephant
    donkey
flavours:
  sour:
    - lemon
  sweet:
    - chocolate
strange: true

和这个文件

#file2.yml
animals:
  - monkey
    pelican
flavours:
  sweet:
    - vanilla
strange: false

结果应包含所有节点,合并的数组和值不是来自上一个文件的数组

#result.yml
animals:
  - elephant
    donkey
    monkey
    pelican
flavours:
  sour:
    - lemon
  sweet:
    - chocolate
      vanilla
strange: false

yq 可以吗?

合并 YAML 文件 yq,连接数组。

假设

file1.ymlfile2.yml 中,animals 数组包含带有多行字符串的单个索引。

elephant
donkey

file1.yml

monkey
pelican

对于 file2.yml

既然你询问了串联数组,我假设file1.ymlfile2.ymlresults.yml应该是这样的:

# file1.yml
animals:
  - elephant
  - donkey
flavours:
  sour:
    - lemon
  sweet:
    - chocolate
strange: true

# file2.yml
animals:
  - monkey
  - pelican
flavours:
  sweet:
    - vanilla
strange: false

# result.yml
animals:
  - elephant
  - donkey
  - monkey
  - pelican
flavours:
  sour:
    - lemon
  sweet:
    - chocolate
    - vanilla
strange: false

例子

使用yq4.x,可以使用ireduce运算符合并两个或多个文件:

https://mikefarah.gitbook.io/yq/operators/reduce#merge-all-yaml-files-together

$ yq4 eval-all '. as $item ireduce ({}; . * $item)' file1.yml file2.yml
animals:
  - monkey
  - pelican
flavours:
  sour:
    - lemon
  sweet:
    - vanilla
strange: false

两个文件都已合并,但重复的键和数组已被最新文件覆盖。

要附加数组而不是覆盖它们,只需在合并运算符 (*) 之后添加一个 +

https://mikefarah.gitbook.io/yq/operators/multiply-merge#merge-appending-arrays

$ yq4 eval-all '. as $item ireduce ({}; . *+ $item)' file1.yml file2.yml
animals:
  - elephant
  - donkey
  - monkey
  - pelican
flavours:
  sour:
    - lemon
  sweet:
    - chocolate
    - vanilla
strange: false