许多应用程序读取多个输入文件并逻辑合并它们,以便具有更高优先级的输入覆盖先前读取的字段。
对于 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
您没有指定您正在使用 yq 的两个实现中的哪一个(请参阅标签信息到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