[英]Using Perl in-line edits, how do you insert a line after the Nth occurence of a string?
寻找在给定字符串的第N次出现之后插入行的方法。
以下是接近我正在寻找的,但是基于行号,而不是基于给定字符串的第N次出现。
perl -ni -e 'print; print "Put after fifth line\n" if $. == 5' inFile.txt
以下将在第二次出现字符串abc
后添加一行xyz
:
perl -pi -e '/abc/&&++$n==2 and $_.="xyz\n"' inFile.txt
如果未启用警告,则无需初始化计数。
perl -pe'$_.="foo\n" if /bar/ && ++$c == 5'
模数( %
)运算符非常适合检测每个Nth。
perl -pe'$_.="foo\n" if /bar/ && ++$c % 5 == 0'
[ 总是很高兴看到有人查看了常见问题解答! 如何更改,删除或插入文件中的行,或附加到文件的开头? 。 ]
我是这样做的:
% 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
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
并且,如果您尚未使用它,可以考虑升级到v5.28。 通过首先写入临时文件然后在程序成功完成后替换源文件, 就地编辑会更安全一些 。
如果您希望在每隔五次出现字符串后重复,您可以在BEGIN
块中创建一个变量并监视它:
perl -n -e 'BEGIN{$c=0;} print; $c++ if /one/; if ($c==5){print "Put after fifth entry\n";$c=0}' inFile.txt
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.