在新字段下合并多个YAML文件

时间:2018-09-25 16:05:30

标签: yaml

我有几个YAML文件,它们代表一个整体。我想将它们合并在声明整个字段的新字段(“来宾”)下。

file1.yml

name: johnny
age: 23

file2.yml

name: sally
age: 21

output.yml

guests:
  - name: johnny
    age: 23
  - name: sally
    age: 21

诸如yq之类的工具使合并/覆盖变得容易,但是我找不到能帮助我将值嵌套在新字段下的工具。

1 个答案:

答案 0 :(得分:0)

您要寻找的工具带有几个不同的名称, 被称为编程语言或脚本语言。我建议 您使用已安装ruamel.yaml的Python。 (免责声明:我是《 该软件包)。

一旦拥有就可以做:

python -c "import sys, ruamel.yaml; yaml=ruamel.yaml.YAML(); yaml.indent(sequence=4, offset=2); yaml.dump(dict(guest=[yaml.load(open(f)) for f in sys.argv[1:]]), sys.stdout)" file*.yml > output.yml

获得所需的输出。

一些注意事项:

  • YAML文件应具有.yaml extension,除非您的文件系统不支持。
  • 默认情况下,序列元素缩进两个空格,并且破折号在其中没有偏移量(即,将与来宾g对齐。因此,yaml.indent()调用。
  • 除非有必要,否则将保留对输入文件的键值文件的任何注释,但不会自动从其原始起始列向右推出,除非有必要,因为会影响映射值。可以对此进行调整,但我不建议单线尝试。
  • 如果需要保留引号,请在单行中添加yaml.preserve_quotes = True;
  • 如果您的任何YAML文件包含多个YAML文档,则上述操作将失败。您需要考虑如何合并文档,并使用try except子句回退到yaml.load_all()进行处理的文档(最好放弃该文档) -liner表示支持多行Python程序。)

您还可以使用yaml命令行实用程序(可通过pip install ruamel.yaml.cmd>=0.5.0安装)执行上述操作:

yaml from-dirs --sequence ./*.yml | yaml map --indent 2,4,2 guest - > output.yml

但这是一个两步过程(首先将多个yaml文件组合为根级别序列,然后将该序列推为要映射的值),因此速度是单线的两倍。