Awk 如何使用yq更改嵌套YAML记录中的值

Awk 如何使用yq更改嵌套YAML记录中的值,awk,sed,yq,Awk,Sed,Yq,我正在尝试将bind_host:localhost更改为bind_host:0.0.0,其中bind_host是YAML文件的第三层嵌套值 文件的当前值 server: application_connectors: - type: http port: 8989 bind_host: localhost request_log: appenders: [] admin_connectors: - type: http port: 8990

我正在尝试将
bind_host:localhost
更改为
bind_host:0.0.0
,其中
bind_host
是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的答案添加图像

第二图像

如果您正在寻找基于Web的解决方案,请使用以下代码段。它运行一个
jq
过滤器,将
server
中包含
bind\u host
的所有对象更新为
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
将修改保存到位。

正在运行


你好!您尝试过什么?问题编辑您想要用
yq
awk
回答吗?如果
yq
,请删除另外两个标记。是否存在您不想替换的
bind\u host:localhost
?如果是,我们如何识别它们?很抱歉反应太晚。我必须将名为
config.yml
的文件名放在哪里?我用我的文件名
config.yaml
替换了
yaml
,但是它返回了
未知命令“config.yml”来表示“yq”
error是的,你做得对。正确复制粘贴命令(在结束单引号后留一个空格),您不应该看到该错误。我只是复制粘贴并用
-yi
更改了
-y
标记,它返回了一个长错误,从
错误:未知命令开始。服务器|=(带|个条目(
我正在shell脚本中使用代码/shfile@Devil'sDream:yq的用法虽然可以解决问题,但效率不高,因为它需要运行
yq
twiceerror
Error:unknown shorthand flag:'y'in-y 2020/05/29 13:07:32 unknown shorthand flag:'y'in-y
@Devil'sDream如果您运行的是yq--version您拥有什么?yq版本3.3。0@Devil“您的团队正在使用另一个yq。我使用的是2.10.1版本