Поиск файла из черного списка - PullRequest
0 голосов
/ 23 апреля 2011

Не знаю, с чего начать, но я ищу, чтобы создать черный список "плохих строк", которые ищут в существующих файлах эти строки.

File:
aaaba
bbbab
cccac
dddba
eeewd
pppwp


blacklist file:
ddba
bbab
...

Желание создать нечувствительный к регистру поиск, основанный на том, что находится в черном списке для поиска похожих строк в текстовом файле. Затем создать файл хитов.

line 2: bbbab
line 4: dddba

Обработка всех символов *, &, |,:,;, #, @,!, ^, (), [], / \ Как стандартных символов ascii и доступных для поиска, если они есть в черном списке / файле

Ответы [ 4 ]

1 голос
/ 23 апреля 2011

Если я понимаю ваш вопрос, index является подходящим инструментом:

use strict;
use warnings;

# Usage: foo.pl DATA_FILE BLACKLIST_FILE
my ($data_file, $blacklist_file) = @ARGV;

# Store the blacklist: lowercase, without newlines.
@ARGV = ($blacklist_file);
my @blacklist = map { chomp; lc } <>;

# Process the data.
@ARGV = ($data_file);
while (my $line = <>){
    for my $bk (@blacklist){
        # Print the line if a blacklist item is found in it.
        if ( index(lc($line), $bk) > -1 ){
            print 'line ', $., ': ', $line;
            last;
        }
    }
}
0 голосов
/ 24 апреля 2011

Создайте регулярное выражение с файлом черного списка и проверьте каждую строку в файле данных.

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

# Load blacklist and make a regexp
sub make_blacklist {
    open my $fd, "<", shift;
    my $bl_re = join "|", map { chomp; quotemeta lc $_ } readline $fd;
    return qr/$bl_re/;
}

# Process the file
my $is_blacklisted = make_blacklist("blacklist.txt");
open my $data_fd, "<", "datafile.txt";
while ( my $line = readline $data_fd ) {
    print "line $.: $line" if $line =~ $is_blacklisted
}

Это может захватить всю вашу память, если черный список огромен.

0 голосов
/ 23 апреля 2011

Я бы использовал Regexp::Assemble, чтобы построить регулярное выражение из всех слов, занесенных в черный список, и использовать его для соответствующей обработки файла:

use strict;
use warnings;
use Regexp::Assemble;

my $file  = 'test.txt';
my $blacklist = 'blacklist.txt';

my $r = Regexp::Assemble->new( flags => 'i' );

# Prepare the regex

open my $bl, '<', $blacklist or die $!;
my @blacklisted = map { quotemeta } <$bl>;

$r->add( $_ ) foreach @blacklisted;
my $regex = $r->re;

# Process the file

open my $fh, '<', $file or die $!;

while ( <$fh> ) {

    print "line $.: $_" if /$regex/;
}
0 голосов
/ 23 апреля 2011

Если Perl не обязателен, вы можете использовать awk

$ awk 'FNR==NR{b[$1];next}{for(i in b){ if($0 ~ i){print}}}' blacklist file
bbbab
dddba

Или, если они являются точными строками, используйте равенство

awk 'FNR==NR{b[$1];next}{for(i in b){if($0 == i){ print}}}' blacklist file
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...