块引用
我正在尝试使用 sed 替换下面 yaml 块的关键 ipAddress 的值
networkInterfaces:
- network:
id: network-1111
ipAddress: 192.168.0.0
Cmd:sed -i 's/\(.*ipAddress:.*\)/ipAddress: 192.168.0.1/g' filename.yaml
这实际上替换了,但它没有将密钥嵌套在networkInterfaces下并放置在主块上
SED 后的输出
networkInterfaces:
- network:
id: network-1834
ipAddress: 192.168.0.1
我试过yq
yq -i '.networkInterfaces.ipAddress = "192.168.0.0"' filename.yaml
它拍摄了错误:无法使用“ipAddress”索引数组(strconv.ParseInt:解析“ipAddress”:语法无效)
想要替换 IpAddress 的值
答案1
这个答案假设您正在使用迈克·法拉赫yq
实用程序(根据您显示的错误消息,您就是)。 安德烈·基斯柳克yq
略有不同。
networkInterfaces
是一个列表,因此如果不选择要在其中访问这些列表元素,则无法访问它network
或在其下方。ipAddress
如果您只有单个元素,您可以使用
yq '.networkInterfaces[0].network.ipAddress = "192.168.0.1"' file
即,将列表第一个元素的ipAddress
的设置为字符串。network
networkInterfaces
192.168.0.1
要设置ipAddress
具有特定条目的id
:
yq '.networkInterfaces[] |= select(.network.id == "network-1111").network.ipAddress = "192.168.0.1"' file
要使用 shell 变量来保存查询id
和新的 IP 号:
id=network-1111 newip=192.168.0.1 yq '.networkInterfaces[] |= select(.network.id == env(id)).network.ipAddress = env(newip)' file