因此,我找到了许多解决方案,可以使用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。
答案 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