2009-06-12 24 views
3

パターンを検索し、その行だけでなく次の3行をファイル(FILE)に書き込む必要があります。これは正しい方法ですか?ありがとう。どのようにして一致する行と次の3行をPerlで印刷できますか?

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

は、それは私にあなたを実現するための分を取った - > $ N - と数値比較しました。 :) –

答えて

5

私は..オペレータ好き:

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

をしかし、あなたは、ABCパターンは3行を次のように繰り返された場合にどうするか説明していません。再起動カウンタが必要な場合は、二重印刷の小さなバグを修正しても正しい方法です。

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

前の3行を印刷するにはどうすればいいですか? – hwnd

+0

3行分のバッファ(例えばリングバッファ)を作成し、パターンを見つけたらこのバッファを印刷する必要があります。 –

5

あなたが行を印刷する必要があるかどうかを知るためにフラグ変数を使用して、それを簡素化することができます:

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

簡素化のほかに、それはまた、問題を修正:あなたのバージョンでは、ABCの文字列が印刷されます二度。

+0

ITYM while、そうでない場合。 –

+0

いいえ、私は、ここでは必要ない間は意味します。 –

+0

@Igor OK、その2つの行はwhileループ内にあることを意図しています。しかし、$ nはループのたびに減少します。私はあなたがabc ;-)で始まるものの間に十分な行を持っていればそれが回り込むかもしれないと思います –

-3

私はむしろコードをいくつか追加して、すべてをより明確にしたいと思います。このような何か作業をする必要があります:

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

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

編集コメントに応答する:正規表現を逃し

  • は修正バグでした。
  • 改行を印刷するかどうかは、ファイルをスラッピングするのと同じように、必ずしもオプションではありません。異なる人々は異なるスタイルを持ちます。これは、人々がPerlについて気に入っていることの1つです!
+0

2つのマイナーな潜在的な問題:おそらく "\ n"を挿入する必要はありません。また、abcの後の3行のいずれかにabcが含まれていれば、それを見逃してしまいます。 –

+0

入力をスラップする必要はありません。 –

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 
+2

ファイル "abc \ nabc \ n1 \ n2 \ n \ n"を指定すると、最初の4行は印刷されますが、5行は印刷されません。 –

5

これは、コマンドラインのgrep(1)の機能です。プログラミングは必要ありません:

コンテキストのグループ間に ' - '行が表示されますが、それらは簡単に削除できます。 Perlですべてをやるのも簡単です。 :)

トリックは、次の3つの行のいずれかに、あなたが探しているパターンも含まれているときにしたいことです。 grep(1)はカウンタをリセットして印刷行を保持します。

+0

これはGNU grepの機能であり、POSIX grepの機能ではありません。 –

0

もう1つの可能な解決策...

#!/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 
関連する問題