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
我正在尝试用这个值替换第二次出现的 versionId
:versionId: 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
标志。
我有这个文件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
我正在尝试用这个值替换第二次出现的 versionId
:versionId: 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
标志。