-4

同じディレクトリに約 200 個のファイルがあり、そのすべてに RegExp を使用して一致させる必要がある特定のコンテンツが含まれており、一致したすべてのコンテンツを 1 つの配列に保存するか、新しいファイルに保存します。

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";
}
4

2 に答える 2

4
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;
}
于 2013-02-01T13:35:59.777 に答える
1

シェルでこれを行うことができます:

最近の xarg がある場合は、grep を並行して (-p) 実行し、それぞれが複数のファイルを処理 (-n) します。巨大で多くのファイルがある場合は、これで問題ありません。

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

またはパールで

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 ツリー内を移動できるモジュールを使用する方がはるかに安全です。

于 2013-02-01T14:11:53.220 に答える