perl搜索&替换目录中所有文件的脚本

时间:2012-04-16 03:57:56

标签: perl replace

我有一个包含近1,200个文件的目录。我需要在perl脚本中连续遍历每个文件,以搜索和替换66个字符串的任何出现。因此,对于每个文件,我需要运行所有66 s& r。 我的替换字符串是泰语,所以我不能使用shell。它必须是.pl文件或类似文件,以便我可以使用 use::utf8。我不熟悉如何逐个打开目录中的所有文件来对它们执行操作。这是我的s& r的样本:

s/psa0*(\d+)/เพลงสดุดี\1/g;

感谢您的帮助。

3 个答案:

答案 0 :(得分:2)

use utf8;
use strict;
use warnings;

use File::Glob qw( bsd_glob );

@ARGV = map bsd_glob($_), @ARGV;

while (<>) {    
   s/psa0*(?=\d)/เพลงสดุดี/g;
   print;
}

perl -i.bak script.pl *

我使用File::Globbsd_glob,因为glob无法“正确”处理空格。它们实际上是相同的函数,但函数的行为根据它的调用方式而有所不同。


顺便说一句,在替换表达式中使用\1(即在正则表达式之外)是没有意义的。 \1是一种正则表达式模式,意味着“匹配捕获的第一次捕获”。所以

s/psa0*(\d+)/เพลงสดุดี\1/g;

应该是

s/psa0*(\d+)/เพลงสดุดี$1/g;

以下是更快的替代方案:

s/psa0*(?=\d)/เพลงสดุดี/g;

答案 1 :(得分:1)

有关可以遍历目录中所有文件名的函数,请参阅opendir / readdir / closedir(非常类似于使用open / readline / close遍历文件中的所有行。)

另请参阅glob函数,该函数返回与某些模式匹配的文件名列表。

答案 2 :(得分:1)

以防万一将来可以使用它。这就是我实际做的。

use warnings;
use strict;

use utf8;

my @files = glob ("*.html");

foreach $a (@files) {
   open IN, "$a" or die $!;
   open OUT, ">$a-" or die $!;
   binmode(IN, ":utf8");
   binmode(OUT, ":utf8");
   select (OUT);
   foreach (<IN>) {
      s/gen0*(\d+)/ปฐมกาล $1/;
      s/exo0*(\d+)/อพยพ $1/;
      s/lev0*(\d+)/เลวีนิติ $1/;
      s/num0*(\d+)/กันดารวิถี $1/;
      ...etc...
      print "$_";
   }
   close IN;
   close OUT;
};