使用 sed 替换第 n 次出现的单词

使用 sed 替换第 n 次出现的单词

我正在学习 sed,因此在这种情况下我试图替换第二次出现的单词“line”。因此,我发出以下命令:

(zet:pc:~/text) sed 's/line/LINUX/2' mytextfile
this is line 1
this is line 2
this is line 3
this is line 4
this is line 5

但从输出中,您可以看到“sed”并未替换第二次出现的世界“line”。那么,我在这里犯了什么错误吗?

答案1

s/../../2替换每行中的第二次出现。

如果您将文件读取为线:

使用 GNU sed

sed -z 's/line/LINUX/2' mytextfile

正常情况下sed

tr '\n' '\0' < mytextfile  |  sed 's/line/LINUX/2'  |  tr '\0' '\n'

请注意,这会产生不正确的结果高度不太可能情况下该文件已经包含 null 字节。


要替换第二行的第一次出现,请参阅其他答案:-)

答案2

在您的文件中,第二次出现在第二行,因此您需要的是:

sed '2s/line/LINUX/' mytextfile

要就地编辑文件:

sed -i '2s/line/LINUX/' mytextfile

2s在第二行进行更改。仅当字符串line在一行或多行中出现多次时,您的命令才有效。

答案3

对于行解析,您应该在命令“s”之前提及行号

$ echo "this is line 1
this is line 2
this is line 3
this is line 4
this is line 5" | sed -e '2s/line/LINUX/'
this is line 1
this is LINUX 2
this is line 3
this is line 4
this is line 5

所以,对你来说命令是:

sed -e '2s/line/LINUX/' mytextfile

是的,如果无论行号如何,如果您只想替换整个文件中的第二次出现,pLumo 的答案是正确的。

sed -z 's/line/LINUX/2' mytextfile

相关内容