Как изменить значение во вложенной записи YAML с помощью yq - PullRequest
0 голосов
/ 28 мая 2020

Я пытаюсь изменить bind_host: localhost на bind_host: 0.0.0.0, где bind_host - это вложенное значение 3-го уровня файла YAML Текущее значение файла

server:
  application_connectors:
  - type: http
    port: 8989
    bind_host: localhost
  request_log:
      appenders: []
  admin_connectors:
  - type: http
    port: 8990
    bind_host: localhost

Ожидаемый результат

server:
  application_connectors:
  - type: http
    port: 8989
    bind_host: 0.0.0.0
  request_log:
      appenders: []
  admin_connectors:
  - type: http
    port: 8990
    bind_host: 0.0.0.0

Я пытаюсь

awk '
/:$/{
  flag=""
}
/server/{
  flag=1
}
flag && NF && (/bind_host:/){
  match($0,/^[[:space:]]+/);
  val=substr($0,RSTART,RLENGTH);
  $NF="0.0.0.0";
  print val $0;
  next
}
1
'   config.yml

РЕДАКТИРОВАТЬ: добавление изображения на основе ответа @inian enter image description here

Второе изображение enter image description here

Ответы [ 2 ]

1 голос
/ 28 мая 2020

Если вы ищете решение на основе kislyuk / yq , используйте следующий фрагмент. Он запускает фильтр jq для обновления всех объектов внутри server, содержащих bind_host, до 0.0.0.0. Флаг -y гарантирует, что объект результата будет возвращен в YAML, а не JSON

yq -y '.server |= ( with_entries ( 
                      if   .value[] | select( keys[] | contains("bind_host") ) 
                      then .value[].bind_host = "0.0.0.0" 
                      else empty end
                    )
                  )' yaml

Если изменение выглядит так, как ожидалось, используйте флаг -i, т.е. yq -yi, чтобы сохранить изменения в- место.

0 голосов
/ 29 мая 2020

Бег

<input.yaml yq -y '((.server.application_connectors[].bind_host| select(.) ) |= gsub("localhost";"0.0.0.0") )' | \
yq -y '((.server.admin_connectors[].bind_host| select(.) ) |= gsub("localhost";"0.0.0.0") )'

у вас есть

server:
  application_connectors:
    - type: http
      port: 8989
      bind_host: 0.0.0.0
  request_log:
    appenders: []
  admin_connectors:
    - type: http
      port: 8990
      bind_host: 0.0.0.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...