Замените значение в 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.