有没有办法使用 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
。
最佳答案
首先使用 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
关于sed - 如何使用 sed 替换第 n 次出现的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13817798/