Как удалить дубликаты строк в файлах конфигурации формата YAML? - PullRequest
0 голосов
/ 10 ноября 2018

У меня есть несколько файлов манифеста / yaml, которые могут иметь или не иметь эти дубликаты пары ключ-значение:

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

Мне нужно поискать каждый из этих файлов и найти эти дубликаты, чтобы я мог удалить один из них.

Примечание: я знаю, что для замены определенной строки (скажем, переключить service: на app:) во всех файлах каталога (скажем, dev) я могу запустить grep -l 'service:' dev/* | xargs sed -i "" 's/\service:/app:/g'. Я ищу связь между строками.

1 Ответ

0 голосов
/ 10 ноября 2018

То, что вы называете YAML, не является YAML.Спецификация YAML очень явно заявляет , что ключи в отображении должны быть уникальными, а ваши ключи не являются:

Содержимое узла отображения представляет собой неупорядоченный набор ключ: значениепары узлов с ограничением уникальности каждого из ключей.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"}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...