我需要搜索一个模式,并将该行以及接下来的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