使用 yq 和 sed 替换 yaml 中的值

使用 yq 和 sed 替换 yaml 中的值

块引用

我正在尝试使用 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的设置为字符串。networknetworkInterfaces192.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

相关内容