yaml 合并的逆操作,例如 yq 乘法?

问题描述 投票:0回答:1

许多应用程序读取多个输入文件并逻辑合并它们,以便具有更高优先级的输入覆盖先前读取的字段。

对于 yaml 文件,我们可以使用合并命令来实现此逻辑,例如:

yq '. *= load("special.yaml")' base.yaml > merged.yaml

对于

base.yaml

a:
  - foo
  - bar
b:
  foo: bar

special.yaml

b:
  foo: SPECIAL
  bar: SPECIAL
c:
  - SPECIAL

其结果为

merged.yaml
:

a:
  - foo
  - bar
b:
  foo: SPECIAL
  bar: SPECIAL
c:
  - SPECIAL

当前的任务是反转此操作:

给定

merged.yaml
base.yaml
,导出一个仅包含
merged.yaml
不在
base.yaml
中的子集的文件。然后可以将结果作为
special.yaml
插入到上面的命令中以重新创建
merged.yaml

merge command-line yaml yq
1个回答
0
投票

您没有指定您正在使用 yq 的两个实现中的哪一个(请参阅标签信息)。

使用 kislyuk/yq,您可以将两个文件分解为其流表示形式,然后从另一个文件中减去一个文件,然后重新组合剩余的差异:

yq -sy '
  reduce (map([tostream | select(has(1))]) | first - last)[] as [$p, $v]
    (null; setpath($p; $v))
' merged.yaml base.yaml
b:
  foo: SPECIAL
  bar: SPECIAL
c:
  - SPECIAL
© www.soinside.com 2019 - 2024. All rights reserved.