Regex 使用Perl在线编辑,如何在字符串出现第n次后插入一行?

Regex 使用Perl在线编辑,如何在字符串出现第n次后插入一行?,regex,perl,scripting,Regex,Perl,Scripting,正在查找在给定字符串第n次出现后插入行的方法 perl -ni -e 'print; print "Put after fifth line\n" if $. == 5' inFile.txt 下面的内容与我要查找的内容很接近,但是是基于行号的,而不是基于给定字符串的第n次出现 perl -ni -e 'print; print "Put after fifth line\n" if $. == 5' inFile.txt 以下内容将在字符串第二次出现后添加一行xyz: perl -pi -

正在查找在给定字符串第n次出现后插入行的方法

perl -ni -e 'print; print "Put after fifth line\n" if $. == 5' inFile.txt
下面的内容与我要查找的内容很接近,但是是基于行号的,而不是基于给定字符串的第n次出现

perl -ni -e 'print; print "Put after fifth line\n" if $. == 5' inFile.txt

以下内容将在字符串第二次出现后添加一行
xyz

perl -pi -e '/abc/&&++$n==2 and $_.="xyz\n"' inFile.txt

如果要在字符串每出现五次后重复一次,可以在
BEGIN
块中创建一个变量并监视它:

perl -n -e 'BEGIN{$c=0;} print; $c++ if /one/; if ($c==5){print "Put after fifth entry\n";$c=0}' inFile.txt
[看到有人查看常见问题解答总是很高兴!]

我会这样做:

% perl -ni -e 'print; print "Inserted\n" if (/time/ && ++$c) == 3' input.txt
计数器变量
$c
由匹配运算符的返回值递增。如果不匹配则为0,如果匹配则为1(它在标量上下文中使用,因此即使使用
/g
也最多只匹配一次)。在更新到
$c
之后,它将与您想要的值进行比较

以下是input.txt:

结果是:

 First time
 Second time
 Third time
 Inserted
 Fourth time
或者,您可以使用
-p
将其缩短一点,它会自动将
打印
放在末尾。在这种情况下,您将在下一行之前插入该行,而不是在前一行之后插入该行(如果您没有足够的行位于某个行之前,则可能会出现问题):


,如果你还没有使用它,你可以考虑升级到V5.28。通过先写入临时文件,然后在程序成功完成后替换源文件。

如果未启用警告,则无需初始化计数

perl -pe'$_.="foo\n" if /bar/ && ++$c == 5'
模(
%
)运算符非常适合检测每N次

perl -pe'$_.="foo\n" if /bar/ && ++$c % 5 == 0'

一行可以多次出现字符串吗?计数器应该重置(或者在满足条件后不应该完全检查条件,具体取决于要求)。。。否则将继续打印插入的
,直到计数器更改。。例如,从
第四次
行中删除
时间
。如果第四行被删除并且脚本如图所示,则插入发生在第三行之前,而不是之后???如果(/\time/&&&+$c)==3'input.txt使用
-p
,则当前行的输出在插入之后。这就是为什么我在第二个一号班轮中把数字改大了一个。
perl -pe'$_.="foo\n" if /bar/ && ++$c % 5 == 0'