Frage Wie kann ich E-Mail-Adressen mit sed schneiden?


Ich habe die folgende email.txt mit:

tsar@gmail.com
c2m_@hotmail.com.es
c72@hotmail.com.es.com;es
m7_@hotmail.es.com
cm_@hotmail.com
@pepito.com 

Und ein sed Befehl zu bekommen

sed -n -r '/\w+@\w+\.\w+((\.\w+)*)?/p' emails.txt 

tsar@gmail.com
cm_@hotmail.com 

Aber es zeigt weiterhin E-Mails mit mehr als einer .com an

Ich möchte diese E-Mails nicht:

c2m_@hotmail.com.es
c72@hotmail.com.es.com;es
m7_@hotmail.es.com 
@pepito.com 

Ich stecke hier fest und ich habe keine Ahnung, wie ich es bekommen soll.


3
2018-06-14 14:25


Ursprung


Welche E-Mails möchten Sie? Nur die das sind user@domain.com? Warum willst du @pepito.com? Wie wäre es mit fulano@domain.es? Versuchen Sie, nur Adressen zu finden, deren Domäne ist foo.com und sonst nichts? - terdon♦
Ja, ich möchte nur die E-Mails mit user@domain.com, ich möchte nicht pepito cuz nicht mit user@domain.com übereinstimmen, aber mein Befehl display user@domain.com.es.com etc - user420047


Antworten:


Mit sed, du könntest es tun:

$ sed -nr '/^[^@]+@[^.]+\.com\s*$/p' file
tsar@gmail.com
cm_@hotmail.com

Die Regex sucht nach einem oder mehreren nicht@ Zeichen am Anfang der Zeile, dann a @, dann ein oder mehrere. Zeichen gefolgt von .com und dann 0 oder mehr Leerzeichen.


Andere Wahlen:

  • Perl

    perl -ne 'print if /^[^@]+@[^.]+\.com\s*$/' file
    
  • GNU grep

    grep -P '^[^@]+@[^.]+\.com\s*$' file
    
  • POSIX grep

    grep -E '^[^@]+@[^.]+\.com\s*$' file
    
  • awk

    awk '$0~/^[^@]+@[^.]+\.com\s*$/' file
    

6
2018-06-14 14:47



Am Ende darf kein Leerzeichen sein, aber \ r. - Pilot6
Ich würde stattdessen egrep verwenden. - Pilot6
@ Pilot6 kein Problem, \s Streichhölzer \r auch. - terdon♦
@ Pilot6 sicher, oder verschiedene andere Werkzeuge. Sie können den gleichen Regex für alle verwenden. Benutze es einfach nicht egrep, das ist zugunsten von abgelehnt worden grep -E (sehen man grep). - terdon♦
Das wusste ich nicht. Ich benutze immer egrep, aber ich weiß, dass -E gleich ist. - Pilot6


Ich würde so etwas verwenden:

sed -n -r '/\w+@\w+\.com$/p' emails.txt

tsar@gmail.com
cm_@hotmail.com

Es wird alle E-Mails im Format abrufen user@xxx.com

Für den Fall, dass Sie etwas mehr "universal" und nicht nur brauchen .com aber auch .fr oder .uk Sie können verwenden:

sed -n -r '/\w+@\w+\.\w+$/p' emails.txt

Dadurch wird jede E-Mail im Format abgerufen user@xxx.xxx


5
2018-06-14 14:44



Ich würde das hier nehmen, ich verstehe das viel besser, danke Mann. - user420047
Also zögern Sie nicht, diese Antwort zu akzeptieren, wenn sie Ihr Problem tatsächlich beantwortet und löst ...;) - user2196728


Der Ausdruck ((\.\w+)*)? passt zusätzliche Sequenzen des Formulars an .xyz nach der ersten Domain. Wenn Sie übereinstimmen möchten nur diese Adressen mit einer einzigen Domäne, dann können Sie dies erzwingen, indem Sie es durch ersetzen $ oder (robuster) \s*$

sed -n -r '/\w+@\w+\.\w+\s*$/p' emails.txt

zu verlangen, dass es nichts (außer möglicherweise Leerzeichen) zwischen der ersten Domäne und dem Ende der Zeile gibt.


3
2018-06-14 14:47