繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM