Как "объединить" два текстовых файла 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
Другие вопросы по тегам