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

Replace Nth String Match In File

所以我找到了许多使用 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。

这是 GNU awk 中的一个:

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

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

解决方案

此解决方案适用于 Solaris 5.11

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

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

chmod 777 script

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