替换文件中的第 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 个字符串匹配项的主要内容,如果未能解决你的问题,请参考以下文章

shell-sed中的编辑命令详解(中)

sed 或 awk 替换前 14 个匹配项

PHP Regex preg_replace 函数仅查找和替换 3 个匹配项中的第一个和最后一个,而不是中间一个

如何匹配第 n 个位置的字符(Cloudera Impala SQL)

如何获得 2 个字符串数组之间的第一个匹配项

替换字符串中的重叠匹配项(正则表达式或字符串操作)