2009-06-12 95 views
3

我需要搜索一个模式,并将该行以及接下来的3行写入文件(FILE)中。这是一个正确的方法吗?谢谢。如何在Perl中打印匹配的行和接下来的三行?

print FILE if /^abc/; 
$n=3 if /^abc/; 
print FILE if ($n-- > 0); 
+1

我花了一分钟实现你 - >为$ N--和数值比较。 :) – 2009-06-12 22:43:44

回答

5

我喜欢..操作:

perl -ne 'print if (/abc/ and $n=3) .. not $n--' 

,但你不已经描述了如果下面三行重复ABC模式应该发生什么。如果你想重启计数器,如果用双重打印修复一个小错误,你的方法是正确的。

perl -ne'$n=4 if/abc/;print if$n-->0' 
5

你可以把它简化为用标志变量知道,如果你要打印一行:

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

而且简化,还修复了一个问题:在您的版本农行字符串会被打印两次。

+0

ITYM while,not if。 – 2009-06-12 22:16:44

+0

不,我的意思是,虽然这里不需要。 – 2009-06-12 22:25:24

+0

@Igor OK,所以这两行代码是在while循环中。但是,$ n每次都会在循环中递减。我想它可以环绕,如果你有足够的行之间以abc开头的行;-) – 2009-06-12 22:41:38

-3

我宁愿多加几行代码,使一切更清晰。像这样的东西应该工作:

my $count = 0; 
while (my $line = pop @file) { 
    if (/^abc/) { 
     $count = 4; 
    } 

    if ($count > 0) { 
     print FILE $line; 
     $count--; 
    } 
} 

编辑回应评论:

  • 缺少正则表达式是一个错误,现在固定。
  • 打印换行符或不打印肯定是可选的,就像扯扯文件一样。不同的人有不同的样式,这是人们喜欢Perl的东西之一!
+0

两个小问题:您可能不需要插入“\ n”。另外,如果abc后面的3行之一包含abc,则会错过它。 – 2009-06-12 22:08:13

2

没有必要发出声音的文件或尝试写在一行代码:

#!/usr/bin/perl 
use strict; 
use warnings; 

while (my $line = <DATA>) { 
    if ($line =~ /^abc/) { 
     print $line; 
     print scalar <DATA> for 1 .. 3; 
    } 
} 
__DATA__ 
x 
y 
z 
abc 
1 
2 
3 
4 
5 
6 
5

这是命令行的grep的功能(1)。无需编程:

grep abc --after-context=3 

你得到“ - ”背景下的群体之间的线路,但这些都是很容易剥离。在Perl中完成整个事情也很容易。 :)

诀窍是你想要做什么时,以下三行之一也包含您正在寻找的模式。 grep(1)将重置计数器并保持打印行。

0

另一种可能的解决方案......

#!/usr/bin/perl 

use strict; 

my $count = 0; 
while (<DATA>) { 
    $count = 1 if /abc/; 
    if ($count >= 1 and $count <= 3) { 
     next if /abc/; 
     print; 
     $count++; 
    } 
} 

__DATA__ 
test 
alpha 
abc 
1 
234123 
new_Data 
test 
相关问题