如何匹配perl目录下的多个文件的正则表达式模式?

时间:2014-01-29 14:33:38

标签: regex perl

我写了一个脚本来匹配模式并返回一个文件的语句

#!/usr/bin/perl 
use strict;
use warnings;

my $file = '/home/Sidtest/sid.txt';
open my $info , $file or die " Couldn't open the $file:$!";
while( my $line = <$info>) {
    if ($line =~ m/^#LoadModule ssl_module/) {
        print "FileName =",$file,"  Status = Failed \n";
    }
    elsif ($line =~ m/^LoadModule ssl_module/) {
        print "FileName =",$file,"  Status = Passed \n";
    }
}
close $info;

所以现在我正在尝试修改此脚本以适用于同一目录下的多个文件。我无法成功地做到这一点。任何人都可以帮助我如何使其适用于目录中的任意数量的文件。

3 个答案:

答案 0 :(得分:1)

这将读取./directory和foreach文件中的每个文件,打印出每一行。

可以将print语句更改为print if /match/或任何您想要的内容:

my @dir = <directory/*>;

foreach my $file (@dir){
    open my $input, '<', $file;
        while (<$input>){
        print "PASS: $_\n" if m/^#LoadModule ssl_module/;
        [...]
    }
}

答案 1 :(得分:0)

变量@ARGV包含启动时发送到脚本的参数列表。循环遍历@ARGV并使用您要处理的文件调用脚本:

#!/usr/bin/perl 
use strict;
use warnings;

foreach my $file (@ARGV) {
    open my $info , $file or die " Couldn't open the $file:$!";
    while( my $line = <$info>) {
        if ($line =~ m/^#LoadModule ssl_module/) {
            print "FileName =",$file,"  Status = Failed \n";
        }
        elsif ($line =~ m/^LoadModule ssl_module/) {
            print "FileName =",$file,"  Status = Passed \n";
        }
    }
    close $info;
}

# process all files *.txt in your dir: ./myscript.pl /home/Sidtest/*.txt

答案 2 :(得分:0)

检查perldoc perlrun,并查看-p和-n参数。本质上,它们将您的脚本视为stdin循环的内容,其中stdin是通过迭代命令行上提供的文件生成的。可以使用$ ARGV变量访问当前正在处理的文件的名称。

所以,你可能会采用一种方法,你的整个脚本看起来更像这样,使用-n param,其中$ _包含当前行。:

if ( m/^#LoadModule ssl_module/) {
   print "FileName =",$ARGV"  Status = Failed \n";
} elsif (m/^LoadModule ssl_module/) {
   print "FileName =",$ARGV,"  Status = Passed \n";
}