Unix 如何删除YAML格式配置文件中的重复行?
我有一堆manifest/yaml文件,可能有,也可能没有这些键值对重复项:Unix 如何删除YAML格式配置文件中的重复行?,unix,duplicates,yaml,Unix,Duplicates,Yaml,我有一堆manifest/yaml文件,可能有,也可能没有这些键值对重复项: ... app: activity-worker app: activity-worker ... 我需要搜索这些文件中的每一个,并找到那些副本,以便我可以删除其中一个 注意:我知道,要替换目录(例如,dev)的所有文件中的某个字符串(例如,将service:切换到app:),我可以运行grep-l'service:'dev/*| xargs sed-I”“'s/\service:/app:/g'。我在寻找线条之间的
...
app: activity-worker
app: activity-worker
...
我需要搜索这些文件中的每一个,并找到那些副本,以便我可以删除其中一个
注意:我知道,要替换目录(例如,
dev
)的所有文件中的某个字符串(例如,将service:
切换到app:
),我可以运行grep-l'service:'dev/*| xargs sed-I”“'s/\service:/app:/g'
。我在寻找线条之间的关系。你所说的YAML,不是YAML。YAML规范
那个
映射中的键必须是唯一的,并且您的键不是:
映射节点的内容是一组无序的key:value节点
配对,限制每个键都是唯一的。亚马尔
对节点没有进一步的限制。特别是,钥匙可能会
如果是任意节点,则可以使用同一节点作为
多个键:值对,映射甚至可以将自身包含为
键或值(直接或间接)
另一方面,一些库错误地实现了这一点,选择覆盖
与键关联的任何以前的值,以及后面的值。就你而言,自从
值是相同的,取哪个值并不重要
此外,块样式表示并不是表示对象的键值对的唯一方法
在“YAML”中映射时,这些重复项也可以在映射中表示,如下所示
{...., app: activity-worker, app: activity-worker, .... }
这两个事件不一定相邻,也不一定在同一条线上。这个
以下内容在语义上也相当于您输入的“YAML”:
{...., app: activity-worker, app:
activity-worker, .... }
如果您有这样的错误“YAML”文件,最好的清理方法是
使用的往返功能
(免责声明:I)
我是该软件包的作者),并具有切换除/警告的功能
包含重复键的错误输入。你可以为你的电脑安装它
Python(虚拟环境)使用:
假设您的文件名为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"}
请提供更多的上下文和一些您试图解释的示例accomplish@bishop好吧,我对任何其他方法都持开放态度,我唯一想弄明白的是如何找到重复的线路。我尝试了
排序文件名| uniq-d
,但是这个命令显示的内容比我需要的重复行多了一点。没有这样的正则表达式。你在寻找线条之间的关系,而不是一行中的模式;并消除了“请和谢谢”噪音。如果这些编辑与您的意图不符,您可以将其回滚。感谢您提供了一个非常全面、信息丰富的答案@v1mg1rl如果这解决了您的问题,请单击复选标记接受此答案(✓) 此答案顶部的旁边。这样其他人就知道你的问题有一个有效答案(无需滚动到注释)。这也会将你的问题标记为在查询中已回答。
{a: 1, app: activity-worker, b: "abc"}