0

文字列パターンを含まないファイルを見つけるコードを書いています。ファイルのリストがあれば、各ファイルの内容を調べる必要があります。文字列パターン「clean」がファイル内に表示されない場合は、ファイル名を取得したいと思います。助けてください。

シナリオは次のとおりです。ファイルのリストがあり、各ファイル内に多数の行があります。ファイルがクリーンな場合、「クリーン」という文言が含まれます。しかし、ファイルが汚れている場合、「クリーン」という言葉は存在せず、ファイルが汚れていることを示す明確な兆候はありません。したがって、各ファイル内にある限り、「クリーン」な文言が検出されない場合は、それをダーティ ファイルとして分類し、ファイル名を追跡したいと考えています。

4

4 に答える 4

4

シンプルなワンライナーを使用できます。

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

でファイルを丸呑みし、ファイル-0777全体に対して正規表現チェックを行います。一致するものが見つからない場合は、ファイル名を出力します。

サポートされていない 5.10 より前のバージョンの perl の場合は、およびで-E置き換えることができます。-E-esay $ARGVprint "$ARGV"

perl -0777 -nlwe 'print "$ARGV\n" if !/clean/i' *.txt
于 2013-01-30T05:23:18.407 に答える
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

仕組みを理解したら、これを簡単にすることができますgrep

于 2013-01-30T05:59:16.850 に答える
0

このような1つの方法:

ls *.txt | grep -v "$(grep -l clean *.txt)"
于 2013-01-30T06:17:24.627 に答える
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);
于 2013-01-30T06:12:37.410 に答える