Замените значение в yaml, если имя: xxx, на bash - PullRequest
0 голосов
/ 27 января 2020

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

Пример:

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

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

Ответы [ 3 ]

3 голосов
/ 27 января 2020

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 обнаружил шаблон / regexp и выполнить sed в этом случае.

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

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

-- означает конец опций, потому что опции обычно начинаются с da sh - что-либо после -- 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 голосов
/ 27 января 2020

Вы можете использовать это 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.

2 голосов
/ 27 января 2020

Используйте синтаксический анализатор с поддержкой синтаксиса 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: Command- YAML / XML процессор и официальная страница GitHub по адресу kislyuk / yq .

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...