使用Perl内联编辑,如何在字符串的第N次出现之后插入行?

时间:2018-08-24 15:16:25

标签: regex perl scripting

寻找一种在给定字符串的第N次出现之后插入行的方法。

以下内容与我要查找的内容很接近,但是基于行号,而不是基于给定字符串的第N次出现。

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

4 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:4)

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

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

模数(%)运算符非常适合每隔N个检测一次。

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

答案 2 :(得分:2)

[很高兴看到有人检查了FAQ! How do I change, delete, or insert a line in a file, or append to the beginning of a file?]

这是我要怎么做:

% perl -ni -e 'print; print "Inserted\n" if (/time/ && ++$c) == 3' input.txt

计数器变量$c增加match运算符的返回值。如果不匹配,则为0;如果不匹配,则为1(它用于标量上下文,因此即使使用/g,它最多也只能匹配一次)。更新到$c之后,将其与您想要的值进行比较。

这是 input.txt

 First time
 Second time
 Third time
 Fourth time

结果:

 First time
 Second time
 Third time
 Inserted
 Fourth time

或者,您可以使用-p使其更短一些,print会自动在末尾放置% perl -pi -e 'print "Inserted\n" if (/time/ && ++$c) == 4' input.txt 。在这种情况下,您最终要在下一行之前插入 前行,而不是在前一行之后前插入行(如果您没有足够的行来插入,可能会出现问题之前):

array

而且,如果您尚未使用v5.28,则可以考虑升级。 In-place editing gets a bit safer,方法是先写入临时文件,然后在程序成功完成后替换源文件。

答案 3 :(得分:1)

如果要在字符串的第五次出现后重复,可以在BEGIN块中创建一个变量并对其进行监视:

perl -n -e 'BEGIN{$c=0;} print; $c++ if /one/; if ($c==5){print "Put after fifth entry\n";$c=0}' inFile.txt