根据key向yaml文件添加多行

Adding multiple lines to yaml file based on key

我有 sample.yaml 文件,如下所示:

 a:
  b:
    - "x"
    - "y"
    - "z"

我还有另一个名为 toadd.yaml 的文件,其中包含以下内容

- "first to add"
- "second to add"

我想修改 sample.yaml 文件,使其看起来像:

 a:
  b:
    - "x
    - "y"
    - "z"
    - "first to add"
    - "second to add"

还有,我不要多余的命名!所以如果 toadd.yaml 中已经有“x”,我不想在 sample.yaml/a.b[ 中将它添加两次=32=]

请注意,我尝试了以下方法:

while read line; do
    yq '.a.b += ['$line']' sample.yaml
done <toadd.yaml

然后我跌倒了:

Error: Bad expression, could not find matching `]`

如果文件比较小,可以直接把第二个文件加载到第一个文件上。参见 Merging two files together

yq '.a.b += load("toadd.yaml")' sample.yaml

mikefarah/yq 版本 4.25.1

上测试

为了解决冗余需求,在重新组成数组之前做一个unique操作。

yq 'load("toadd.yaml") as $data | .a.b |= ( . + $data | unique )' sample.yaml

可以进一步简化为

yq '.a.b |= ( . + load("toadd.yaml") | unique )' sample.yaml