Perl正则表达式,在标签之间抓取文本

时间:2012-08-27 14:45:25

标签: regex perl

我有一个大文件,看起来像这样:

<Feed stack_overflow>
   sourceid 32456
   prefeed 1
   <LOG>
     level 1
     cache info
  </LOG>
</Feed>

我想搜索此文件中的任何内容,并检索包含Feed标记的所有内容。因此,如果我搜索32456,我将获得上述代码中的所有内容。

我现在的代码是:

#!/usr/bin/perl
my $input = "<Feed stack_overflow"; #Search string
my $end = "</Feed>"; #End string
open (DATA, "file.config") or die "Error";

my @list = grep /\b$input\b(.*?)\b$end\b/, <DATA>;
chomp @list;
print "$_\n foreach @list;

但我没有得到任何结果,即使很难知道我知道我搜索的是什么。 我已成功设法打印出包含此正则表达式的特定字符串的每一行:

my @list = grep /\b$input\b/, <DATA>;

但我需要帮助打印两个标签之间的所有内容。

2 个答案:

答案 0 :(得分:5)

您的正则表达式逐行处理数据,但您的字符串跨越多行。您可以使用range operator

while (<$DATA>) {
    print if /$input/ .. /$end/;
}

如果要排除边框线,可以将内线更改为

print if (/$input/ .. /$end/) !~ /^1$|E0/}

DATA是预定义的文件句柄。考虑使用其他名称,或使用词法文件句柄(在我的示例中为$DATA)。

答案 1 :(得分:0)

#!/usr/bin/perl
my $input = "<Feed stack_overflow"; #Search string
my $end = "</Feed>"; #End string
open (DATA, "file.config") or die "Error";

undef $/; # slurp mode
$_=<DATA>;
close DATA;

@list = m/\b$input\b(.*?)\b$end\b/mg;
map { print "found : $_\n" } @list;

(由于原始代码中的错误而进行了多次编辑)