替换文件中的第 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
所以我找到了许多使用 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