Sed命令:如何搜索从一个单词开始的第二行出现?

Sed command: how to search for the second line occurrence starting from a word?

我有这个文件simple.yml:

services:
  - name: first
    image: first_image
    versionId: 1.0.0_first_image_id
  - name: second
    image: second_image
    versionId: 2.0.1_second_image_id

我正在尝试用这个值替换第二次出现的 versionIdversionId: image_id_edited 以便文件看起来像这样:

services:
  - name: first
    image: first_image
    versionId: 1.0.0_first_image_id
  - name: second
    image: second_image
    versionId: image_id_edited

这里的值2.0.1_second_image_id经常变化,所以我不能做静态搜索。目前,我有这个 sed 命令,但它不起作用:

sed -rz "s/versionId:\s*.*$/versionId: image_id_edited/2" -i simple.yaml

我想要一个正则表达式来搜索第二个 versionId: ... 直到它到达行尾!谢谢!

您似乎指望 -z 标志将整个输入解释为一行,因此 s 命令的 2 标志导致整个文件中的第二个匹配被替换。问题是相关计数超过 non-overlapping 匹配。您的模式被锚定到行尾,您需要在多行模式下进行匹配,以便有可能出现两个 non-overlapping 匹配:

sed -rz 's/versionId:\s*.*$/versionId: image_id_edited/m2' -i simple.yaml

也就是在s命令中增加一个m标志。