如何只解析一个单词QUERY的行? 我试过了:
my @strs = loadf('ck.txt');
while(1)
{
my $str = shift @strs;
if(!$str)
{
exit;
}
if($str =~ /QUERY/)
{
($cl) = $str =~ /QUERY: (.*?)/;
open F, ">>go.txt";
print F $cl;
close F;
}
}
sub loadf {
open (F, "<".$_[0]) or erroropen($_[0]);
chomp(my @data = <F>);
close F;
return @data;
}
ck.txt:
22.11.2012 16:55:45 +02:00
IP: 99.992.92.992
QUERY: BANNER_LANG=ru; textext community-lang=ru
REFERER: http:/site.ru/827
AGENT: Opera/9.80 (Windows NT 6.0) Presto/2.12.388 Version/12.10
22.11.2012 16:55:44 +02:00
IP: 89.189.191.6
QUERY: BANNER_LANG=ru; text; community-lang=ru
REFERER: http:/site.ru/444
AGENT: Opera/9.80 (Windows NT 5.1; U; ru) Presto/2.10.289 Version/12.00
但它不起作用= \
答案 0 :(得分:1)
您的问题是(.*?)
。 ?
使匹配变得非贪婪,因此在满足正则表达式的同时,它将匹配尽可能少的字符。在这种情况下,这总是零个字符。
此外,您的代码可以简化:
use strict;
use warnings;
my @strs = ('BLAH', ' QUERY: foobarbaz', 'QUERY asdf');
#open the file once: more efficient.
open my $file, '>>', 'go.txt' or die "Can't open file: $!";
for my $str (@strs)
{
#Perform all matching logic in one go.
if($str =~ m/QUERY: (.*)/)
{
print {$file} $1;
}
}
close $file;
答案 1 :(得分:0)
删除?
以使其贪婪,或在结束$
后添加)
例如
QUERY: (.*)
或
QUERY: (.*?)$
答案 2 :(得分:0)
你使事情变得复杂。您的问题可以通过单行解决:
perl -nlwe 'print if /^QUERY/' query.txt >> go.txt
如果您的数据不正常,您可以考虑从正则表达式中删除行锚^
的开头。
如果您想删除QUERY:
这个词,可以使用这个单行词:
perl -nlwe 'print if s/^QUERY:\s*//' query.txt >> go.txt
这个单行代码的解码代码是(为简单起见而编辑):
use warnings; # -w option: enable warnings
BEGIN { $/ = "\n"; $\ = "\n"; } # -l option: handle line endings
while (<>) { # -n option: read input file or stdin
chomp; # -l option again
print $_ if s/^QUERY:\s+//; # our code
}