2009-12-28 46 views

回答

8

使用grep,而不是Perl的

grep -v '@bad\.com' inputfile > outputfile 

在Windows

findstr /v "@bad\.com" inputfile > outputfile 
+0

+1不错干净。谢谢你的答案。 –

+1

你应该逃离这个点。 – ghostdog74

+0

@ ghostdog74:好点;完成 –

0

的所有电子邮件地址这应该做到:

$badDomain = "bad.com"; 
while(<>) 
{ 
     s{\s+$}{}; 
     print "$_\n" if(!/\@$badDomain$/); 
} 
+1

因为我们从来没有'chomp()'这一行,所以默认情况下它已经在最后有一个换行符。你不需要用另一个打印它(除非你需要输出线之间的空行)。 –

+0

@Chris:如果仔细观察第4行,我将删除所有尾随的空格。这也会删除最后的\ n。所以打印中需要\ n。 – codaddict

+0

啊。在那种情况下,为什么不是's/$ s + $/\ n /;'所以保留了新行,然后只是'print if/regex /'? –

-3

验证码应该从输入文件中过滤所有@ bad.com地址。

my @array = <>; 

foreach(@array) { 
    if(!/\@bad.com$/) { 
    print $_; 
    } 
} 
+0

太糟糕了。为什么你会在'<>'中徘徊,当你可以迭代它以获得相同的效果,几乎没有内存影响? –

-1

的Perl

perl -ne 'print if !/@bad\.com/' file 

AWK

awk '!/@bad\.com/' file 
+0

这不是正确的模式。它也不包括notbad.com等。 –

0

下面将让你有一个脚本,你可以在时间提高......而不是简单地过滤掉@ bad.com (你可以用一个简单的grep来完成),你可以编写你的脚本,这样你就可以很容易地复制哪些域是不需要的。

my $bad_addresses = {'bad.com'=>1}; 

while (my $s = <>) { 
    print $s unless (is_bad_address($s)); 
} 

sub is_bad_address { 
    my ($addr) = @_; 
    if ($addr=~/^([^@]+)\@([^@\n\r]+)$/o) { 
     my $domain = lc($2); 
     return 0 unless (defined $bad_addresses->{$domain}); 
     return $bad_addresses->{$domain}; 
    } 
    return 1; 
} 
1

Email::Address是一个很好的处理电子邮件地址的模块。

这里是一个可以激起你胃口的例子:

use Email::Address; 

my $data = 'this person email is [email protected] 
blah blah [email protected] blah blah 
[email protected] 
'; 

my @emails  = Email::Address->parse($data); 
my @good_emails = grep { $_->host ne 'bad.com' } @emails; 

say "@emails";  # => [email protected] [email protected] an[email protected] 
say "@good_emails"; # => [email protected] 
相关问题