替换文件中的第 N 个字符串匹配项
Posted
技术标签:
【中文标题】替换文件中的第 N 个字符串匹配项【英文标题】:Replace Nth String Match In File 【发布时间】:2019-03-17 06:50:48 【问题描述】:所以我找到了许多使用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。
【问题讨论】:
How to replace the nth occurrence of a string using sed的可能重复 我知道,我在上面发布了解决方案。 【参考方案1】:这是 GNU awk 中的一个:
$ awk 'BEGINRS=/^$/;ORS=""$0=gensub(/Hello/,"World",2)' file
Hello
World
Hello
Hello
Hello
它将整个文件视为一条记录,gensub
替换第二个匹配项。
【讨论】:
【参考方案2】:解决方案
此解决方案适用于 Solaris 5.11
Perl
perl-pe 'sHello++$n == 2 ? $& : "World"ge\' script > tmp && mv tmp script
注意:这会更改脚本文件的权限。您可能需要使用以下命令更新权限:
chmod 777 script
有关文件权限的更多信息,请查看documentation
【讨论】:
以上是关于替换文件中的第 N 个字符串匹配项的主要内容,如果未能解决你的问题,请参考以下文章
PHP Regex preg_replace 函数仅查找和替换 3 个匹配项中的第一个和最后一个,而不是中间一个