【发布时间】:2010-12-30 14:12:24
【问题描述】:
如何扫描包含以换行符分隔的电子邮件地址的文件并删除属于某个域的电子邮件地址,例如hacker@bad.com。我想删除所有@bad.com的电子邮件地址
【问题讨论】:
标签: perl email-address
如何扫描包含以换行符分隔的电子邮件地址的文件并删除属于某个域的电子邮件地址,例如hacker@bad.com。我想删除所有@bad.com的电子邮件地址
【问题讨论】:
标签: perl email-address
使用grep 代替 Perl
grep -v '@bad\.com' inputfile > outputfile
在 Windows 上
findstr /v "@bad\.com" inputfile > outputfile
【讨论】:
应该这样做:
$badDomain = "bad.com";
while(<>)
{
s{\s+$}{};
print "$_\n" if(!/\@$badDomain$/);
}
【讨论】:
chomp()-ed 行,默认情况下它的末尾已经有一个换行符。您不需要与另一个打印它(当然,除非您希望输出行之间有空白行)。
s/\s+$/\n/; 保留换行符,然后只保留 print if /regex/ ?
此代码应从输入文件中过滤所有@bad.com 地址。
my @array = <>;
foreach(@array) {
if(!/\@bad.com$/) {
print $_;
}
}
【讨论】:
<> 中啜饮,因为你可以迭代它以获得相同的效果,几乎没有内存影响?
Perl
perl -ne 'print if !/@bad\.com/' file
awk
awk '!/@bad\.com/' file
【讨论】:
以下内容将允许您拥有一个可以及时增强的脚本...而不是简单地过滤掉@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;
}
【讨论】:
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
【讨论】:
与其他人所做的没有太大不同。
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
【讨论】: