如何在Perl中打印匹配的行和接下来的三行?

Bi.*_*Bi. 3 perl

我需要搜索一个模式,然后将该行以及接下来的3行写入文件(FILE).这是一个正确的方法吗?谢谢.

print FILE if /^abc/;
$n=3 if /^abc/;
print FILE if ($n-- > 0);
Run Code Online (Sandbox Code Playgroud)

Hyn*_*dil 6

我喜欢..运营商:

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)


Igo*_*kon 5

您可以简化它以使用标志变量来知道是否应该打印一行:

while( <$input> ) {
    $n=4 if /^abc/; 
    print FILE if ($n-- > 0);
    }
Run Code Online (Sandbox Code Playgroud)

除了简化之外,它还解决了一个问题:在你的版本中,abc字符串将被打印两次.


bri*_*foy 5

这是命令行grep(1)的一个特性.无需编程:

grep abc --after-context=3
Run Code Online (Sandbox Code Playgroud)

你在上下文组之间得到' - '行,但这些行很容易剥离.在Perl中完成整个事情也很容易.:)

当以下三行中的一行还包含您正在寻找的模式时,诀窍是您想要做的.grep(1)将重置计数器并保持打印行.