我需要搜索一個模式,並將該行以及接下來的3行寫入文件(FILE)中。這是一個正確的方法嗎?謝謝。如何在Perl中打印匹配的行和接下來的三行?
print FILE if /^abc/;
$n=3 if /^abc/;
print FILE if ($n-- > 0);
我需要搜索一個模式,並將該行以及接下來的3行寫入文件(FILE)中。這是一個正確的方法嗎?謝謝。如何在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模式應該發生什麼。如果你想重啓計數器,如果用雙重打印修復一個小錯誤,你的方法是正確的。
perl -ne'$n=4 if/abc/;print if$n-->0'
你可以把它簡化爲用標誌變量知道,如果你要打印一行:
while(<$input>) {
$n=4 if /^abc/;
print FILE if ($n-- > 0);
}
而且簡化,還修復了一個問題:在您的版本農行字符串會被打印兩次。
ITYM while,not if。 – 2009-06-12 22:16:44
不,我的意思是,雖然這裏不需要。 – 2009-06-12 22:25:24
@Igor OK,所以這兩行代碼是在while循環中。但是,$ n每次都會在循環中遞減。我想它可以環繞,如果你有足夠的行之間以abc開頭的行;-) – 2009-06-12 22:41:38
我寧願多加幾行代碼,使一切更清晰。像這樣的東西應該工作:
my $count = 0;
while (my $line = pop @file) {
if (/^abc/) {
$count = 4;
}
if ($count > 0) {
print FILE $line;
$count--;
}
}
編輯迴應評論:
兩個小問題:您可能不需要插入「\ n」。另外,如果abc後面的3行之一包含abc,則會錯過它。 – 2009-06-12 22:08:13
沒有必要發出聲音的文件或嘗試寫在一行代碼:
#!/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
這是命令行的grep的功能(1)。無需編程:
grep abc --after-context=3
你得到「 - 」背景下的羣體之間的線路,但這些都是很容易剝離。在Perl中完成整個事情也很容易。 :)
訣竅是你想要做什麼時,以下三行之一也包含您正在尋找的模式。 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--和數值比較。 :) – 2009-06-12 22:43:44