我有一个文本文件,我想抓住以模式开头并以特定模式结束的特定行。 例如:
Text
Text
Startpattern
print this line
Print this line
print this line
Endpattern
Text
Text
Text
还应打印开始图案和结束图案。我的第一次尝试并没有真正成功:
my $LOGFILE = "/var/log/logfile";
my @array;
# open the file (or die trying)
open(LOGFILE) or die("Could not open log file.");
foreach $line () {
if($line =~ m/Sstartpattern/i){
print $line;
foreach $line2 () {
if(!$line =~ m/Endpattern/i){
print $line2;
}
}
}
}
close(LOGFILE);
提前感谢您的帮助。
答案 0 :(得分:14)
您可以使用标量range operator:
open my $fh, "<", $file or die $!;
while (<$fh>) {
print if /Startpattern/ .. /Endpattern/;
}
答案 1 :(得分:2)
这个怎么样:
#!perl -w
use strict;
my $spool = 0;
my @matchingLines;
while (<DATA>) {
if (/StartPattern/i) {
$spool = 1;
next;
}
elsif (/Endpattern/i) {
$spool = 0;
print map { "$_ \n" } @matchingLines;
@matchingLines = ();
}
if ($spool) {
push (@matchingLines, $_);
}
}
__DATA__
Text
Text
Startpattern
print this line
Print this line
print this line
Endpattern
Text
Text
Text
Startpattern
print this other line
Endpattern
如果您还想打印开始和结束模式,也可以在if块中添加push语句。
答案 2 :(得分:1)
这样的东西?
my $LOGFILE = "/var/log/logfile";
open my $fh, "<$LOGFILE" or die("could not open log file: $!");
my $in = 0;
while(<$fh>)
{
$in = 1 if /Startpattern/i;
print if($in);
$in = 0 if /Endpattern/i;
}