Инструмент, который вы ищете, имеет несколько разных имен и называется языками программирования или языками сценариев.Я рекомендую вам использовать 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файлы в качестве последовательности корневого уровня, затем выдвигая эту последовательность в качестве значения для отображения), и, следовательно, в два раза медленнее, чем однострочный.