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

问题描述 投票:2回答:3

假设我有一个包含这几行的文件

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。它不适合我。谁能帮我这个?

regex perl
3个回答
3
投票
perl -i -pe's/abc/ ++$count == 2 ? "xyz" : "abc" /eg' file

即使abc每行出现不止一次,这也有效。


2
投票

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

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

0
投票

我把它做成了一个脚本。第一个参数是模式,第二个是替换,第三个是重复次数,第四个是文件,你也可以省略文件并插入数据vístdin。

#!/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 $_;
}
© www.soinside.com 2019 - 2024. All rights reserved.