2009-12-28 14 views

Répondre

8

Utilisation grep au lieu de Perl

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

Sous Windows

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

+1 agréable n propre. Merci pour la réponse de Windows aussi. –

+1

vous devriez échapper au point. – ghostdog74

+0

@ ghostdog74: bon point; fait –

0

Cela devrait faire:

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

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). –

+0

@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

+0

Ah. Dans ce cas, pourquoi ne pas s/\ s + $/\ n /; 'de sorte que la nouvelle ligne est conservée, alors juste' print if/regex/'? –

-3

ce code devrait filtrer toute l'adresse @ bad.com à partir des fichiers d'entrée.

my @array = <>; 

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

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? –

-1

Perl

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

awk

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

Ce n'est pas le bon modèle. Il exclut également notbad.com, etc. –

0

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; 
} 
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]