1

如何扫描包含由换行符分隔的电子邮件地址的文件并删除属于某个域的文件,例如hacker@bad.com. 我想摆脱所有电子邮件地址@bad.com

4

7 回答 7

8

使用grep而不是 Perl

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

在 Windows 上

findstr /v "@bad\.com" inputfile > outputfile
于 2009-12-28T20:27:29.130 回答
1

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

这是一个可能会激起您食欲的示例:

use Email::Address;

my $data = 'this person email is hacker@bad.com
blah blah hacker@good.com blah blah
another@bad.com
';

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

say "@emails";       # => hacker@bad.com hacker@good.com another@bad.com
say "@good_emails";  # => hacker@good.com
于 2009-12-29T15:03:39.020 回答
0

与其他人所做的没有太大不同。

use strict;
use warnings;

my @re = map { qr/@(.*\.)*\Q$_\E$/ } qw(bad.com mean.com);

while (my $line = <DATA>) {
    chomp $line;
    if (grep { $line =~ /$_/ } @re) {
        print "Rejected: $line\n";
    } else {
        print "Allowed: $line\n";
    }
}

__DATA__
good@good.com
bad@bad.com
notbad@bad.comm.com
alsobad@bad.com
othergood@good.com
not@mean.com
good@reallymean.com
bad@really.mean.com
于 2009-12-29T16:02:27.300 回答
0

以下将允许您拥有一个可以及时增强的脚本......您可以编写脚本,以便您可以轻松复杂化哪些域是不需要的。

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;
}
于 2009-12-29T00:49:03.193 回答
0

这应该这样做:

$badDomain = "bad.com";
while(<>)
{
        s{\s+$}{};
        print "$_\n" if(!/\@$badDomain$/);
}
于 2009-12-28T20:41:59.757 回答
-1

Perl

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

awk

awk '!/@bad\.com/' file 
于 2009-12-28T23:48:07.140 回答
-3

此代码应从输入文件中过滤所有@bad.com 地址。

 my @array = <>;

 foreach(@array) {
   if(!/\@bad.com$/) {
     print $_;
   }
 }
于 2009-12-28T21:04:04.033 回答