在Perl中查找与字符串模式不匹配的文件

时间:2013-01-30 04:58:33

标签: perl

我正在编写代码来查找不包含字符串模式的文件。如果我有一个文件列表,我必须查看每个文件的内容,如果字符串模式“clean”没有出现在文件中,我想获取文件名。请帮忙。

以下是该方案: 我有一个文件列表,每个文件里面都有很多行。如果文件是干净的,它将具有“干净”的措辞。但是如果文件很脏,则“干净”的措辞不存在,并且没有明确的指示告诉文件是脏的。所以只要在每个文件里面,如果没有检测到“干净”的措辞,我会把它归类为脏文件,我想跟踪文件名

4 个答案:

答案 0 :(得分:4)

您可以使用简单的单行:

perl -0777 -nlwE 'say $ARGV if !/clean/i' *.txt

使用-0777对文件进行slurping,对整个文件进行正则表达式检查。如果未找到匹配项,我们将打印文件名。

对于不支持-E的低于5.10的perl版本,您可以将-E替换为-e,将say $ARGV替换为print "$ARGV"

perl -0777 -nlwe 'print "$ARGV\n" if !/clean/i' *.txt

答案 1 :(得分:2)

如果您需要在Perl中生成列表,File::Finder模块将简化生活。

未经测试,但应该有效:

use File::Finder;

my @wanted = File::Finder              # finds all         ..
              ->type( 'f' )            # .. files          ..
              ->name( '*.txt' )        # .. ending in .txt ..
              ->in( '.' )              # .. in current dir ..
              ->not                    # .. that do not    ..
              ->contains( qr/clean/ ); # .. contain "clean"

print $_, "\n" for @wanted;

整洁的东西!

编辑:

现在我对问题有了更清楚的了解,我认为这里不需要任何模块:

use strict;
use warnings;

my @files = glob '*.txt';  # Dirty & clean laundry

my @dirty;

foreach my $file ( @files ) {     # For each file ...

    local $/ = undef;             # Slurps the file in
    open my $fh, $file or die $!;

    unless ( <$fh> =~ /clean/ ) { # if the file isn't clean ..
        push @dirty, $file;       # .. it's dirty
    }

    close $fh;
}

print $_, "\n" for @dirty;        # Dirty laundry list

获得机制后,可以将其简化为la grep等等。

答案 2 :(得分:0)

#!/usr/bin/perl


use strict;
use warnings;

open(FILE,"<file_list_file>");
while(<FILE>)
{
my $flag=0;
my $filename=$_;
open(TMPFILE,"$_");
        while(<TMPFILE>)
        {
         $flag=1 if(/<your_string>/);
        }
    close(TMPFILE);
    if(!$flag)
        {
        print $filename;
        }
}
close(FILE);

答案 3 :(得分:0)

这样的一种方式:

ls *.txt | grep -v "$(grep -l clean *.txt)"