连接数组时合并两个 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.yml
和 file2.yml
中,animals
数组包含带有多行字符串的单个索引。
elephant
donkey
file1.yml
,
monkey
pelican
对于 file2.yml
。
既然你询问了串联数组,我假设file1.yml
、file2.yml
和results.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
例子
使用yq
4.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
我想合并两个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.yml
和 file2.yml
中,animals
数组包含带有多行字符串的单个索引。
elephant
donkey
file1.yml
,
monkey
pelican
对于 file2.yml
。
既然你询问了串联数组,我假设file1.yml
、file2.yml
和results.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
例子
使用yq
4.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