2011-04-23 91 views
0

不知道从哪里开始,但我希望建立的“坏行”黑名单,搜索这些线路的现有文件..从黑名单中搜索文件

File: 
aaaba 
bbbab 
cccac 
dddba 
eeewd 
pppwp 


blacklist file: 
ddba 
bbab 
... 

婉婷创建不区分大小写的搜索基于黑名单中的内容搜索类似的文本文件。然后创建一个点击文件。

line 2: bbbab 
line 4: dddba 

对待所有字符*,&,|,:,;,#,@,^,(),[]/\作为标准的ASCII字符和搜索,如果它是在黑名单/文件!

回答

0

如果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 
+0

awk:运行时错误:正则表达式编译失败(缺少操作数) || testlist.test(如果添加到黑名单中),也如果您搜索*作为字符,它不起作用 – user349418 2011-04-23 12:30:32

+0

你在哪个系统上。? – ghostdog74 2011-04-23 12:31:52

+0

ubuntu 10.10 box – user349418 2011-04-23 12:32:42

0

我会使用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

既不可行,第一个似乎只是输出列表,另一个不会运行..看到调试:http://pastebin.com/raw.php?i=sBMSHQFN – user349418 2011-04-23 13:59:43

+0

@ user349418:它不工作,因为Regexp :: Assemble不是'quotemeta'的元字符。现在就测试一下,看起来不错。 – Zaid 2011-04-23 16:18:49

1

如果我明白你的问题,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

用黑名单文件制作正则表达式,并测试数据文件中的每一行。

#!/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 
} 

如果黑名单很大,这可能会占用你所有的内存。