Deep merging the YAML files using yq
Example inputs
# 1.yaml
a:
b: 1
c:
- apple
- banana
top: foo
# 2.yaml
a:
d: 2
c:
- cherry
top: bar
Deep merging, lists appended
$ yq eval-all '. as $item ireduce ({}; . *+ $item)' 1.yaml 2.yaml
a:
b: 1
c:
- apple
- banana
- cherry
d: 2
top: bar
Deep merging, lists overwritten
$ yq eval-all 'select(fileIndex == 0) * select(fileIndex == 1)' 1.yaml 2.yaml
a:
b: 1
c:
- cherry
d: 2
top: bar
Bonus tracks: key-based merging
Insert items by key
# 1.yaml
- name: alpha
value1: aaa1
value2: bbb1
- name: bravo
value1: aaa2
value2: bbb2
# 2.yaml
name: myconfig
value: bravo
---
name: myconfig2
value: notexist
Result:
$ yq eval-all '(select(fileIndex == 0)) as $list |
(select(fileIndex == 1)) as $cfg |
(($list[] | select(.name == $cfg.value) | del(.name)) // {}) as $match |
$cfg |
.value = $match' 1.yaml 2.yaml
name: myconfig
value:
value1: aaa2
value2: bbb2
---
name: myconfig2
value: {}
Merge items by key
# 1.yaml
- name: alpha
value1: aaa1
value2: bbb1
- name: bravo
value1: aaa2
value2: bbb2
# 2.yaml
name: myconfig0
value:
rel_id: alpha
value1: override
---
name: myconfig
value:
rel_id: bravo
value3: ccc3
Result:
$ yq eval-all '
(select(fileIndex == 0)) as $list |
(select(fileIndex == 1)) as $cfg |
($list[] | select(.name == $cfg.value.rel_id) | del(.name)) as $match |
$cfg |
.value = ( ($match // {}) * ( (.value // {}) | del(.rel_id) ) )
' 1.yaml 2.yaml
name: myconfig0
value:
value1: override
value2: bbb1
---
name: myconfig
value:
value1: aaa2
value2: bbb2
value3: ccc3