【问题标题】:Replace Nth String Match In File替换文件中的第 N 个字符串匹配项
【发布时间】: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。

【问题讨论】:

标签: regex python-3.x awk sed programming-pearls


【解决方案1】:

这是 GNU awk 中的一个:

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

它将整个文件视为一条记录,gensub 替换第二个匹配项。

【讨论】:

    【解决方案2】:

    解决方案

    此解决方案适用于 Solaris 5.11

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

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

    chmod 777 script

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-08-04
      • 2015-11-26
      • 1970-01-01
      • 1970-01-01
      • 2014-08-28
      • 2015-08-17
      • 2015-07-07
      相关资源
      最近更新 更多