我如何"合并"两个YAML文本文件?

时间:2016-03-01 03:28:34

标签: git merge yaml pyyaml

使用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        

可以使用任何差异/合并工具吗?

编辑:在期望的结果中修复拼写错误

1 个答案:

答案 0 :(得分: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()更智能,即递归。