首页 > 解决方案 > Sed-替换紧接在特定模式之后的下一个字符串单词,但仅在文件中第一次出现

问题描述

我需要一个sed命令,它将在模式之后立即替换字符串,但仅在文件中第一次出现

为了替换第一次出现,给出了:

sed -i '' -e '0,/abc/s//def/' filename

这将替换匹配的字符串而不是匹配后的字符串

对于匹配后立即替换字符串,给出了:

sed -i 's/\(text=\)\(.*\)/\1qwerty/' filename

这将在下一个匹配后立即替换字符串,但适用于所有出现。

在一个文件中,我有两次这样的字符串“text=abc”:

abc
text=occurrence1
qwe
uio
text=occurrence2
dsf

我想occurence1用字符串“qwerty”替换该部分,以便输出如下所示:

text=qwerty.

但我只想为文件中的第一次出现而不是所有地方这样做。

标签: bashshell

解决方案


应该GNU sed工作:

例子:

cat file:
abc
text=xyz1
qwe
uio
text=xyz
dsf

现在,只用“text=qwerty”替换第一次出现的字符串“text=”:

sed -r '0,/text=/{s/text=(.*)/text=qwerty/}' file

输出:

abc
text=qwerty
qwe
uio
text=xyz
dsf

选项“-r”在sed

-r  : --regexp-extended, to use extended regular expressions

推荐阅读