寻找一种在给定字符串的第N次出现之后插入行的方法。
以下内容与我要查找的内容很接近,但是基于行号,而不是基于给定字符串的第N次出现。
perl -ni -e 'print; print "Put after fifth line\n" if $. == 5' inFile.txt
答案 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