Объединить несколько файлов yaml с разделителем - PullRequest
0 голосов
/ 08 мая 2019

Мне нужно объединить несколько yaml-файлов развертывания k8s в один сценарий развертывания и при этом создать отдельный разделитель --- между каждым файлом.Я знаю конкретную глубину, на которой будут жить файлы, а также имя файла, однако я не знаю, сколько их будет в данный момент, поэтому я использовал приведенный ниже оператор find для

  1. рекурсивный поиск файла yaml
  2. concat каждого
  3. , передаваемого в команде tail в качестве разделителя

find . -type f -name 'deployment.yml' -exec cat {} + | tail -n +1 * > finalDeployment.yml

Тем не менее, это создает неправильный синтаксис yaml, вставляя разделитель ==> <==:

enter image description here

Я мог бы просто попросить другую задачу запустить поиск / замену, используявыше, в качестве токенов префикса / суффикса, однако я бы хотел что-то более сжатое в приведенном выше утверждении.

Возможно ли передать в определенный символ / набор символов разделитель в команде cat, или есть другой способ для этого?

1 Ответ

0 голосов
/ 09 мая 2019

То, что вы хотите сделать, не гарантированно работает.Например, у вас есть два файла YAML:

foo: bar

и:

%YAML 1.2
---
baz

Как видите, второй файл содержит директиву.Он также показывает, что --- в YAML - это не разделитель, а маркер конца директив .Это необязательно, если у вас нет директив, как в первом документе.Если вы объедините оба документа так, как вы хотите, вы получите документ с двумя ---, а %YAML 1.2 будет интерпретирован как контент, потому что это происходит после маркера конца директивы.

Так чтона самом деле вы хотите пометить конец каждого документа ..., маркер конца документа .После этого маркера синтаксический анализатор сбрасывается в исходное состояние, что гарантирует, что второй документ анализируется точно так же, как если бы он был в отдельном файле.

Кроме того, добавление * не причинит никакого вреда1019 * к последнему документу, поскольку он не запускает другой документ неявно.Таким образом, ваша команда может выглядеть следующим образом (я полагаюсь на ваше утверждение, что вы знаете глубину, на которой лежат файлы, и, например, ожидайте глубину в 3 директории):

echo -n > finalDeplayment.yml
for f in */*/*/deployment.yml; do
  cat $f >> finalDeployment.yml; echo "..." >> finalDeployment.yml
done
...