如何解决此匹配问题并替换Perl文件中仅单词的第n个出现的问题

时间:2019-02-18 11:10:33

标签: regex perl

假设我有一个文件,其中包含以下几行

Hello abc
hii
how are you
Hello abc

如果我想用xyz代替abc的第二次出现,该怎么办?

我想要类似的输出

Hello abc
hii
how are you
Hello xyz

我尝试做perl -pi -e 's/abc/xyz/ if $. == 2' filename。它对我不起作用。有人可以帮我吗?

3 个答案:

答案 0 :(得分:3)

perl -i -pe's/abc/ ++$count == 2 ? "xyz" : "abc" /eg' file

即使abc每行出现多次,此方法也有效。

答案 1 :(得分:2)

计算abc出现的次数,如果等于2,则等于2:

perl -i -pe'$found++ if /abc/; s/abc/xyz/ if $found ==2' filename

答案 2 :(得分:0)

我已将其作为脚本完成。第一个参数是模式,第二个参数是替换,第三个参数是重复次数,第四个是文件,您也可以省略文件并插入标准输入数据。

#!/usr/bin/env perl
use v5.28;
my $patt = shift;
my $rep = shift;
my $nth = shift;
my $reps = 0;
while (<>) {
    $reps++ if /$patt/;
    s/$patt/$rep/ if (/$patt/ && $reps == $nth);
    print $_;
}