用yq将YAML合并到特定的数组项中

  • 本文关键字:数组 yq YAML 合并 yaml yq
  • 更新时间 :
  • 英文 :


给定母版。yml…

containers:
- name: project-a
items:
- CCC
- name: project-z
items:
- CCC
- DDD

…还有最新消息。yml…

- name: project-z
items:
- CCC
- EEE

…我想把它归并成正确的项。这将得到:

containers:
- name: project-a
items:
- CCC
- name: project-z
items:
- CCC
- DDD
- EEE

如果更新是针对project-a

,下面的yq4可以工作
yq ea 'select(fileIndex==0) * {"containers":select(fileIndex==1)}' master.yml update.yml

但是,使用提供的project-z更新,它错误地替换了第一个数组条目(您最终得到两个project-z)。

这与另一个stackoverflow问题类似,kev有一个非常简洁的解决方案(我认为)。

我已经把他的解决方案添加到yq文档:https://mikefarah.gitbook.io/yq/operators/multiply-merge#merge-arrays-of-objects-together-matching-on-a-key

在你的例子中,这只会在第二个文件匹配第一个文件的结构时起作用,(也就是说,它也有'containers'作为父文件):

yq eval-all '
(
((.containers[] | {.name: .}) as $item ireduce ({}; . *+ $item )) as $uniqueMap
| ( $uniqueMap  | to_entries | .[]) as $item ireduce([]; . + $item.value)
) as $mergedArray
| select(fi == 0) | .containers  = $mergedArray
` file.yaml file2.yaml
containers:
- name: project-a
items:
- CCC
- name: project-z
items:
- CCC
- DDD
- CCC
- EEE

基本上,它的工作原理是根据名称简化成一个合并的映射(正如你提到的,如果已经是这样的话,这将更容易),然后将其转换回数组。

免责声明:我写的是yq

在深入研究了手册之后,我得到了这个:

yq ea 'select(fi==1).0.name as $p | (select(fi==0).containers.[] | select(.name==$p)) = (select(fi==1) | .0 | . headComment="AUTO-UPDATED") |  select(fi==0)'  master.yml update.yml

替换而不是合并project-z,首先搜索name匹配update.yml,然后完全替换内容。

我理解的根本原因是数据被格式化为列表,它应该是一个字典(name是唯一的)。

这将合并琐碎,并在未来更好!

containers:
project-a:
items:
- CCC
project-z:
items:
- CCC
- DDD
- EEE

相关内容

  • 没有找到相关文章

最新更新