2009-06-12 87 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 
相關問題