Замените значение в yaml, если name: xxx на bash

Я хочу изменить файл yaml value на основе name:

Пример:

spec:
  containers:
    - name: app1
      image: imageurl.com
      command: []
      env:
      - name: MONGO_HOST
        value: localhost

Здесь вы можете видеть, что мы добавили env для хоста mongo. Теперь используяBASH я хочу изменить MONGO_HOST value на основе условия вроде if - name: MONGO_HOST set value: 172.16.87.98

3 ответа

Решение

Сед требует знания, действительно ли MONGO_HOST в этом файле, поэтому в решение входит grep.

 if grep -Fq -- "- name: MONGO_HOST" file.yaml; then
   sed 's/^\([[:space:]]\+value:\).*/\1 172.16.87.98/' file.yaml
 fi

Оператор if берется из оболочки, которая проверяет, действительно ли grep нашла шаблон / регулярное выражение, и выполняет sed в этом случае.

В -F означает, что grep ищет фиксированные строки, а не BRE (базовое регулярное выражение) или ERE (расширенное регулярное выражение)

В -q означает тихий или беззвучный вывод.

В -- означает конец опций, потому что опции обычно начинаются с тире - что-нибудь после -- grep больше не будет рассматривать его как вариант

Если есть / больше одной строки value:с регулярным выражением в этом файле.yml sed заменит их все. Но, как было предложено, уже используйте подходящий инструмент для анализа / редактирования файла yaml.

Изменить: как указано Ranvijay Sachan sed может проверить наличие шаблона и заменить следующую строку.

Использование редактора файлов на основе команд ed

printf '%s\n' '/MONGO_HOST/+1s/^\([[:space:]]\+value:\).*/\1 172.16.87.98/' w | ed -s file.yaml

Используйте синтаксический анализатор YAML, например yq который использует jq в качестве процессора JSON. yq принимает ввод YAML, преобразует его в JSON и передает его в jq

Фильтр, часть под '..' применяется к объекту JSON, и формируется результирующий JSON с обновленным IP-адресом, который преобразуется обратно в формат YAML из-за -y аргумент.

yq -y '(.spec.containers[].env[]|select(.name == "MONGO_HOST").value)|="172.16.87.98"' yaml  

Установка и использование довольно просты, что доступно в yq: Командная строка процессора YAML/XML, а официальная страница GitHub находится по адресу kislyuk / yq.

Вы можете использовать опцию редактирования на месте -i как sed -i чтобы избежать перенаправления во временный файл с yq -yi '...'

Вы можете использовать это awk:

awk '/^[ \t]*- *name: *MONGO_HOST[ \t]*$/{p=NR}
p && NR==p+1{sub(/value:.+/, "value: 172.16.87.98")} 1' file.yml

spec:
  containers:
    - name: app1
      image: imageurl.com
      command: []
      env:
      - name: MONGO_HOST
        value: 172.16.87.98

Однако имейте в виду, что обычно для этого лучше использовать специальные парсеры yaml.

Другие вопросы по тегам