替换文件中的第N个字符串匹配

时间:2018-10-12 05:20:42

标签: regex python-3.x awk sed programming-pearls

因此,我找到了许多解决方案,可以使用sed s/regexFind/replacement/n代替一行中单词的第n次出现。

例如s/hello hello hello/world/2> hello world hello

但是,我要执行的操作是更新文件中第三个匹配项的更新。

Hello
Hello
Hello
Hello
Hello

基本上期望sed -i s/Hello/world/2 $filename会将文件内容替换为:

Hello
World
Hello
Hello
Hello

但是事实并非如此。有什么建议吗?

我希望不使用Python样式的全行读取解决方案,因为我希望替换子字符串的文件不是UTF-8。

2 个答案:

答案 0 :(得分:1)

这里是GNU awk中的一个:

$ awk 'BEGIN{RS=/^$/;ORS=""}$0=gensub(/Hello/,"World",2)' file 
Hello
World
Hello
Hello
Hello

它将整个文件视为一条记录,gensub替换第二个匹配项。

答案 1 :(得分:0)

解决方案

此解决方案适用于Solaris 5.11

Perl perl-pe 's{Hello}{++$n == 2 ? $& : "World"}ge\' script > tmp && mv tmp script

注意:这将更改脚本文件的权限。您可能需要使用以下命令来更新权限:

chmod 777 script

有关文件权限的更多信息,请查看documentation