我需要搜索一个模式,然后将该行以及接下来的3行写入文件(FILE).这是一个正确的方法吗?谢谢.
print FILE if /^abc/;
$n=3 if /^abc/;
print FILE if ($n-- > 0);
Run Code Online (Sandbox Code Playgroud)
我喜欢..运营商:
perl -ne 'print if (/abc/ and $n=3) .. not $n--'
Run Code Online (Sandbox Code Playgroud)
但是你没有描述如果abc模式在以下三行中重复会发生什么.如果你想重启计数器,如果用双重打印修复一个小错误你的方法是正确的.
perl -ne'$n=4 if/abc/;print if$n-->0'
Run Code Online (Sandbox Code Playgroud)
您可以简化它以使用标志变量来知道是否应该打印一行:
while( <$input> ) {
$n=4 if /^abc/;
print FILE if ($n-- > 0);
}
Run Code Online (Sandbox Code Playgroud)
除了简化之外,它还解决了一个问题:在你的版本中,abc字符串将被打印两次.
这是命令行grep(1)的一个特性.无需编程:
grep abc --after-context=3
Run Code Online (Sandbox Code Playgroud)
你在上下文组之间得到' - '行,但这些行很容易剥离.在Perl中完成整个事情也很容易.:)
当以下三行中的一行还包含您正在寻找的模式时,诀窍是您想要做的.grep(1)将重置计数器并保持打印行.