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
twiceerrorError: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版本