sed - 如何替换 yaml.j2 嵌套值

问题描述 投票:0回答:1

我有一个命令用来替换 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)

bash sed yaml
1个回答
0
投票

通过使用命令行 YAML 解析器,如 kislyuk/yqmikefarah/yqitchyny/gojq,这个问题变得小菜一碟。使用所有这些(对于 gojq,将

yq
替换为
gojq
),您可以简单地确定要更改的确切位置。添加
-i
标志以就地更改输入文件(而不是将结果输出到 STDOUT)。

yq '.brand.group1.jerry.myid = 5' file.yaml
© www.soinside.com 2019 - 2024. All rights reserved.