0

我正在尝试将 YAML 文件的第 3 层嵌套值更改为File 的当前bind_host: localhostbind_host: 0.0.0.0bind_host

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 的回答添加图片 在此处输入图像描述

第二张图片 在此处输入图像描述

4

2 回答 2

1

如果您正在寻找基于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标志 ieyq -yi将修改保存在原地。

于 2020-05-28T07:33:22.803 回答
0

跑步

<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
于 2020-05-29T12:55:00.750 回答