Я хочу изменить файл 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

5
Ranvijay Sachan 27 Янв 2020 в 11:19

2 ответа

Лучший ответ

Sed требует знать, есть ли действительно 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: с регулярным выражением, sed заменит их все. Но, как уже предлагалось, используйте подходящий инструмент для разбора / редактирования файла yaml.

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

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

printf '%s\n' '/MONGO_HOST/+1s/^\([[:space:]]\+value:\).*/\1 172.16.87.98/' w | ed -s file.yaml
3
Jetchisel 27 Янв 2020 в 14:52

Используйте синтаксический анализатор с поддержкой синтаксиса 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 '...'

2
Inian 3 Фев 2020 в 16:59