объединить несколько файлов YAML в новом поле - PullRequest
0 голосов
/ 25 сентября 2018

У меня есть несколько файлов YAML, представляющих части целого.Я хочу объединить их в новом поле ("гости"), которое объявляет целое.

file1.yml

name: johnny
age: 23

file2.yml

name: sally
age: 21

вывод.yml

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

инструменты, такие как yq, упрощают слияние / перезапись, но я не могу найти ни одного, который бы помог мне вкладывать значения в новые поля.

1 Ответ

0 голосов
/ 26 сентября 2018

Инструмент, который вы ищете, имеет несколько разных имен и называется языками программирования или языками сценариев.Я рекомендую вам использовать Python с установленным ruamel.yaml.(отказ от ответственности: я являюсь автором этого пакета).

Как только у вас есть это, вы можете сделать:

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 , если ваша файловая система не поддерживает это.
  • По умолчанию элементы последовательности имеют отступ в два пробела иВ этом случае dash не имеет смещения (то есть выровняется с g гостями. Следовательно, вызов yaml.indent().
  • Любые комментарии к файлам значений ключа вашего входного файла будут сохранены , ноне выталкивается автоматически вправо от их исходного начального столбца, если в этом нет необходимости, поскольку мешающее значение мешает. Регулировка возможна, но я бы не рекомендовал делать это в однострочнике.
  • Если вам нужно сохранить кавычки, добавьте yaml.preserve_quotes = True; в однострочник
  • Если какой-либо из ваших файлов YAML содержит несколько документов YAML, описанное выше не удастся. Вам нужно подумать о том, как объединить документы,и используйте предложение try except, чтобы вернуться к yaml.load_all() для документов, которые это делают (было бы неплохо отказаться от однострочника в пользу многострочной 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файлы в качестве последовательности корневого уровня, затем выдвигая эту последовательность в качестве значения для отображения), и, следовательно, в два раза медленнее, чем однострочный.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...