【问题标题】:Read file content and use Regular Expression to locate a pattern in each File in Perl读取文件内容并使用正则表达式在 Perl 中的每个文件中定位一个模式
【发布时间】:2013-02-01 22:11:53
【问题描述】:

我有大约 200 个文件位于同一目录中,所有这些文件都包含我需要使用 RegExp 匹配的特定内容,并将所有匹配的内容保存到单个数组中或将它们存储在新文件中。

在使用 notepad++ 正则表达式引擎时,我执行以下操作来定位模式:

<div class="opacity description">(.*)</div>

这就是我正在寻找的模式。

这就是我打开并列出目录中所有文件的方式。

my $d = shift;

opendir(D, "details/") || die "Can't opedir $d: $!\n";
my @list = readdir(D);
closedir(D);

foreach my $f (@list) {
  print "\$f = $f\n";
}

【问题讨论】:

  • 不要使用正则表达式解析 HTML。使用 HTML::TreeBuilder::XPath 或其他 HTML 解析库。
  • 这里是使用除正则表达式之外的东西来解析 HTML/XML 的情况。如果您将文件插入并使用正则表达式解析整个内容,那么您最好希望——因为你使用了一个贪婪的点星——“不透明度描述”是文件中的最后一个 div。否则,您将得到一些其他 div 或父 div 的内容。所以让它不贪婪?不,您只会在第一个子 div 结束之前获得内容。

标签: regex perl directory


【解决方案1】:
use strict;
use warnings;

use HTML::TreeBuilder::XPath;

my ($dir) = @ARGV;

my @files = glob "$dir/*";

for my $file (@files) {
  my $tree = HTML::TreeBuilder::XPath->new_from_file($file);
  my @opacity = $tree->findnodes_as_strings('//div[@class="opacity description"]');
  print "\n$file\n";
  print "  $_\n" for @opacity;
}

【讨论】:

    【解决方案2】:

    你可以用 shell 做到这一点:

    如果你有最近的 xarg,它将并行运行 grep (-p) 并且每个进程 (-n) 几个文件。如果你有大量的文件,那就太好了。

    ls -1 | xargs -p3 -n 5 -i grep -HP '<div class="opacity description">(.*)</div>' {}
    

    或使用 perl

    foreach my $f (@list) {
      local $/='';  
      print "\$f = $f\n";
      open(FILE,'<',$f) or die $f;
      my $c = <FILE>;
      close(FILE);
      if ($c =~ m!<div class="opacity description">(.*)</div>!){
        print "Found in $f\n";
      }
    }
    

    对于处理 HTML 文件,使用理解 HTML 并且可以在 DOM 树中遍历的模块要安全得多。

    【讨论】:

      猜你喜欢
      • 2021-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-12
      • 1970-01-01
      • 1970-01-01
      • 2012-06-09
      • 1970-01-01
      相关资源
      最近更新 更多