我有一堆清单文件/ yaml文件,这些文件可能有也可能没有这些键值对重复项:
...
app: activity-worker
app: activity-worker
...
我需要搜索每个文件并找到那些重复项,以便删除其中一个。
注意:我知道要替换目录(例如service:
)的所有文件中的某个字符串(例如,将app:
切换为dev
),我可以运行{{1 }}。我正在寻找线与线之间的关系。
答案 0 :(得分:0)
您所说的YAML不是YAML。 YAML规范 very explicitly states 映射中的键必须唯一,并且您的键不能:
映射节点的内容是一组无序的键:value节点 对,但每个键都是唯一的。 YAML 在节点上没有进一步的限制。特别是,按键可能 如果是任意节点,则可以将同一节点用作 几个键:值对,以及映射甚至可以将自身包含为 键或值(直接或间接)。
另一方面,某些库未正确实现此功能,因此选择覆盖 与键关联的任何先前值,以及后续值。就您而言, 值是相同的,那么采用哪个值并不重要。
此外,您的块样式表示法也不是唯一的表示键值对的方法。 在“ YAML”中进行映射,这些重复项也可以在映射中表示为
{...., app: activity-worker, app: activity-worker, .... }
这两个事件不一定相邻,也不在同一行。的 以下内容也与您输入的内容在语义上等效“ YAML”:
{...., app: activity-worker, app:
activity-worker, .... }
如果您的“ YAML”文件存在此类错误,最好的清理方法是
使用以下的往返功能
ruamel.yaml
(免责声明:我
是该软件包的作者),以及除/警告外切换的能力
在包含重复键的错误输入上。您可以为其安装
Python(虚拟环境)使用:
pip install ruamel.yaml
假设您的文件名为input.yaml
,其中包含:
a: 1 # some duplicate keys follow
app: activity-worker
app: activity-worker
b: "abc"
您可以运行以下单行代码:
python -c "import sys; from ruamel.yaml import YAML; yaml = YAML(); yaml.preserve_quotes=yaml.allow_duplicate_keys=True; yaml.dump(yaml.load(open('input.yaml')), sys.stdout)"
获得:
a: 1 # some duplicate keys follow
app: activity-worker
b: "abc"
,如果您输入的是:
{a: 1, app: activity-worker, app:
activity-worker, b: "abc"}
输出为:
{a: 1, app: activity-worker, b: "abc"}