Comment puis-je analyser un fichier contenant des adresses e-mail séparées par un nouveau caractère de ligne et supprimer celles qui appartiennent à un certain domaine, par ex. [email protected]
. Je veux me débarrasser de toutes les adresses e-mail qui sont @bad.com
Comment puis-je filtrer les adresses e-mail appartenant à un domaine particulier en utilisant Perl?
Comment puis-je filtrer les adresses e-mail appartenant à un domaine particulier en utilisant Perl?
Répondre
Utilisation grep
au lieu de Perl
grep -v '@bad\.com' inputfile > outputfile
Sous Windows
findstr /v "@bad\.com" inputfile > outputfile
Cela devrait faire:
$badDomain = "bad.com";
while(<>)
{
s{\s+$}{};
print "$_\n" if(!/\@$badDomain$/);
}
Puisque nous n'avons jamais 'chomp()' -ed la ligne, il aura déjà un retour à la ligne par défaut. Vous n'avez pas besoin de l'imprimer avec un autre (à moins bien sûr que vous vouliez des lignes vides entre vos lignes de sortie). –
@Chris: Si vous regardez de près la ligne 4, je supprime tous les espaces de fin. Cela supprimera également le \ n final. Donc, un \ n dans l'impression est nécessaire. – codaddict
Ah. Dans ce cas, pourquoi ne pas s/\ s + $/\ n /; 'de sorte que la nouvelle ligne est conservée, alors juste' print if/regex/'? –
ce code devrait filtrer toute l'adresse @ bad.com à partir des fichiers d'entrée.
my @array = <>;
foreach(@array) {
if(!/\@bad.com$/) {
print $_;
}
}
C'est horrible. Pourquoi insisteriez-vous dans '<>' alors que vous pourriez juste le parcourir pour le même effet, sans presque aucun impact sur la mémoire? –
Perl
perl -ne 'print if !/@bad\.com/' file
awk
awk '!/@bad\.com/' file
Ce n'est pas le bon modèle. Il exclut également notbad.com, etc. –
Voici vous permettra d'avoir un script que vous pouvez améliorer en temps ... Au lieu de filtrer simplement @ bad.com (que vous pouvez faire avec un grep simple), vous pouvez écrire votre script afin que vous puissiez facilement identifier les domaines qui ne sont pas souhaités.
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
est un bon module pour traiter les adresses email.
Voici un exemple qui peut vous vous mettre en appétit:
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] [email protected]
say "@good_emails"; # => [email protected]
Pas trop différent de ce que les autres ont fait.
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__
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
+1 agréable n propre. Merci pour la réponse de Windows aussi. –
vous devriez échapper au point. – ghostdog74
@ ghostdog74: bon point; fait –