Как "объединить" два текстовых файла YAML?
Использовать meld / xxdiff / или что-то еще?
Скажите, если у меня есть два файла yaml, как я могу объединить их автоматически? у каждого из них есть несколько сотен строк. общая часть abc:
abc:
x:
0: null
y:
1: null
def:
x:
0: string
...
а также
abc:
u: null
v: null
w: null
def:
u:
0: null
v: null
w: null
...
желаемый результат:
abc:
x:
0: null
y:
1: null
u: null
v: null
w: null
def:
x:
0: string
u:
0: null
v: null
w: null
это можно сделать с помощью любых инструментов сравнения / слияния?
редактировать: исправлена опечатка в желаемом результате
2 ответа
Я не думаю, что вы можете делать то, что вы хотите, без разбора файлов. Однако вы можете сделать это с помощью короткой программы на Python:
import sys
import ruamel.yaml
data = None
for file_name in sys.argv[1:]:
d = ruamel.yaml.round_trip_load(open(file_name, 'rb'))
if data is None:
data = d
continue
for k in d:
data[k].update(d[k])
print(ruamel.yaml.round_trip_dump(data, indent=2, explicit_end=True))
это дает (при условии, что соответствующие входные файлы:
abc:
x:
0:
y:
1:
u:
v:
w:
def:
x:
0: string
u:
0:
v:
w:
...
Обратите внимание, что лишние пробелы теряются как ruamel.yaml (раскрытие: я являюсь автором этого пакета), только (частично) сохраняются пробелы, если они находятся рядом с комментариями. Вы также должны были бы сделать .update()
умнее, то есть рекурсивно, если требуется больше, чем слияние ключей верхнего уровня.
Другой скрипт Python, который работает:
import sys
import hiyapyco
merged_yaml = hiyapyco.load(sys.argv[1:], method=hiyapyco.METHOD_MERGE)
print(hiyapyco.dump(merged_yaml))
Сохраните его как файл и передайте имена файлов в качестве аргументов:
python3 ./merge_yml.py first.yml second.yml > result.yml