Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unix 如何删除YAML格式配置文件中的重复行?_Unix_Duplicates_Yaml - Fatal编程技术网

Unix 如何删除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'。我在寻找线条之间的

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

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