0

因此,我找到了许多解决方案来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 风格的 read-every-line 解决方案,因为我希望替换子字符串的文件不是 UTF-8。

4

2 回答 2

1

这是 GNU awk 中的一个:

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

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

于 2018-10-12T05:39:59.210 回答
0

解决方案

此解决方案适用于 Solaris 5.11

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

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

chmod 777 script

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

于 2018-10-19T03:42:55.797 回答