如何删除YAML格式配置文件中的重复行?

时间:2018-11-10 01:07:27

标签: unix duplicates yaml

我有一堆清单文件/ yaml文件,这些文件可能有也可能没有这些键值对重复项:

...
app: activity-worker
app: activity-worker
...

我需要搜索每个文件并找到那些重复项,以便删除其中一个。

注意:我知道要替换目录(例如service:)的所有文件中的某个字符串(例如,将app:切换为dev),我可以运行{{1 }}。我正在寻找线与线之间的关系。

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"}