我有一个命令用来替换 myid 值,但它并不完美。这是发生问题的文档:
brand:
group1:
jerry:
myid: 1
ben:
myid: 2
group2:
jerry:
myid: 3
jane:
myid: 4
我正在使用 sed 来替换 myid。我可以查找 ID 和名称,但不能查找组
sed -i -E "/jerry:/,/myid:/ s|(myid:).*|\1 NEWID|; " PATH_TO_FILE.yaml.j2
问题 1:这将替换两个 jerry 的 ID。我只想在第 1 组中替换杰瑞
问题 2:这将取代名称中包含 jerry 的任何内容,甚至
group1:
jamesjerry:
myid: 5
这是我尝试按组过滤以解决问题 1 的命令
sed -i -E "/group1:/,/jerry:/,/myid:/ s|(myid:).*|\1 NEWID|; " PATH_TO_FILE.yaml.j2
但后来我收到错误:
sed: 1: "/group1:/,jerry ...": invalid command code ,
如何使用 sed 通过过滤 sed 中的 3 个不同值来替换值并确保仅过滤确切的名称? (Group1 -> Jerry -> myid)
通过使用命令行 YAML 解析器,如 kislyuk/yq 或 mikefarah/yq 或 itchyny/gojq,这个问题变得小菜一碟。使用所有这些(对于 gojq,将
yq
替换为 gojq
),您可以简单地确定要更改的确切位置。添加 -i
标志以就地更改输入文件(而不是将结果输出到 STDOUT)。
yq '.brand.group1.jerry.myid = 5' file.yaml