解析文件中只需要的行

时间:2012-11-22 15:31:12

标签: regex perl parsing

如何只解析一个单词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

但它不起作用= \

3 个答案:

答案 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
}