如何使用sed替换第n个字符串

时间:2012-12-11 10:02:36

标签: sed

有没有办法用sed替换文件中第n个字符串?

我正在使用sed -i '0,/jack.*/ s//jill/'替换第一次出现。

如何更改它以取代第n次出现?

我的文件内容如下:

first line
second line
third line
jack=1
fifth line
jack=
seventh line

我不知道jack=之后的值,它可以是任何东西。

我想用jack=替换第二次出现的jill及其后面的任何内容。

1 个答案:

答案 0 :(得分:20)

首先使用^替换所有换行符,这些换行符不会出现在文件中的任何其他位置(例如tr)。您需要执行此操作才能为sed创建单个字符串。然后将其传递给sed并告诉它替换第n个字符串。最后,将输出传递回tr以重新创建换行符。

对于n = 2,命令为:

$ tr '\n' '^' < file | sed 's/jack/jill/2' | tr '^' '\n'
first line
second line
third line
jack
fifth line
jill
seventh line

<强>更新

使用以下命令,也可以使用sed完成,而无需先更改换行符:

$ sed ':a;N;$!ba;s/jack/jill/2' file

或者,使用awk

$ awk '/jack/{c+=1}{if(c==2){sub("jack","jill",$0)};print}' file