パターンを検索し、その行だけでなく次の3行をファイル(FILE)に書き込む必要があります。これは正しい方法ですか?ありがとう。どのようにして一致する行と次の3行をPerlで印刷できますか?
print FILE if /^abc/;
$n=3 if /^abc/;
print FILE if ($n-- > 0);
パターンを検索し、その行だけでなく次の3行をファイル(FILE)に書き込む必要があります。これは正しい方法ですか?ありがとう。どのようにして一致する行と次の3行をPerlで印刷できますか?
print FILE if /^abc/;
$n=3 if /^abc/;
print FILE if ($n-- > 0);
私は..
オペレータ好き:
perl -ne 'print if (/abc/ and $n=3) .. not $n--'
をしかし、あなたは、ABCパターンは3行を次のように繰り返された場合にどうするか説明していません。再起動カウンタが必要な場合は、二重印刷の小さなバグを修正しても正しい方法です。
perl -ne'$n=4 if/abc/;print if$n-->0'
前の3行を印刷するにはどうすればいいですか? – hwnd
3行分のバッファ(例えばリングバッファ)を作成し、パターンを見つけたらこのバッファを印刷する必要があります。 –
あなたが行を印刷する必要があるかどうかを知るためにフラグ変数を使用して、それを簡素化することができます:
while(<$input>) {
$n=4 if /^abc/;
print FILE if ($n-- > 0);
}
簡素化のほかに、それはまた、問題を修正:あなたのバージョンでは、ABCの文字列が印刷されます二度。
ITYM while、そうでない場合。 –
いいえ、私は、ここでは必要ない間は意味します。 –
@Igor OK、その2つの行はwhileループ内にあることを意図しています。しかし、$ nはループのたびに減少します。私はあなたがabc ;-)で始まるものの間に十分な行を持っていればそれが回り込むかもしれないと思います –
私はむしろコードをいくつか追加して、すべてをより明確にしたいと思います。このような何か作業をする必要があります:
my $count = 0;
while (my $line = pop @file) {
if (/^abc/) {
$count = 4;
}
if ($count > 0) {
print FILE $line;
$count--;
}
}
編集コメントに応答する:正規表現を逃し
2つのマイナーな潜在的な問題:おそらく "\ n"を挿入する必要はありません。また、abcの後の3行のいずれかにabcが含まれていれば、それを見逃してしまいます。 –
入力をスラップする必要はありません。 –
にファイルを読ままたは単一の行にあなたのコードを書いてみる必要はありません。
#!/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
ファイル "abc \ nabc \ n1 \ n2 \ n \ n"を指定すると、最初の4行は印刷されますが、5行は印刷されません。 –
これは、コマンドラインのgrep(1)の機能です。プログラミングは必要ありません:
コンテキストのグループ間に ' - '行が表示されますが、それらは簡単に削除できます。 Perlですべてをやるのも簡単です。 :)
トリックは、次の3つの行のいずれかに、あなたが探しているパターンも含まれているときにしたいことです。 grep(1)はカウンタをリセットして印刷行を保持します。
これはGNU grepの機能であり、POSIX grepの機能ではありません。 –
もう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
は、それは私にあなたを実現するための分を取った - > $ N - と数値比較しました。 :) –