Wie kann ich mit sed E-Mail-Adressen ausschneiden?

Wie kann ich mit sed E-Mail-Adressen ausschneiden?

Ich habe folgende E-Mails.txt mit:

[email protected]
[email protected]
[email protected];es
[email protected]
[email protected]
@pepito.com 

Und ein sed-Befehl zum Abrufen

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

[email protected]
[email protected] 

Es werden jedoch weiterhin E-Mails mit mehr als einer .com-Endung angezeigt.

Ich möchte diese E-Mails nicht:

[email protected]
[email protected];es
[email protected] 
@pepito.com 

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

Antwort1

Mit sedkönnen Sie Folgendes tun:

$ sed -nr '/^[^@]+@[^.]+\.com\s*$/p' file
[email protected]
[email protected]

Der reguläre Ausdruck sucht nach einem oder mehreren Nicht- @Zeichen am Anfang der Zeile, dann einem @, dann einem oder mehreren Nicht- .Zeichen, gefolgt von .comund dann 0 oder mehr Leerzeichen.


Andere Möglichkeiten:

  • Perl

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

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

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

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

Antwort2

Ich würde so etwas verwenden:

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

[email protected]
[email protected]

Es wird jede E-Mail im Format abrufen[email protected]

Falls Sie etwas „Universelleres“ benötigen und nicht nur, .comsondern auch .froder .ukkönnen Sie Folgendes verwenden:

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

Dadurch werden alle E-Mails im Format[email protected]

Antwort3

Der Ausdruck ((\.\w+)*)?passt zu weiteren Sequenzen der Form .xyznach der ersten Domäne. Wenn Sienurdiese Adressen mit einer einzigen Domäne, dann können Sie dies erzwingen, indem Sie es durch $oder (robuster) ersetzen.\s*$

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

um zu verlangen, dass zwischen der ersten Domäne und dem Zeilenende nichts steht (außer möglicherweise Leerzeichen).

verwandte Informationen