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 sed
kö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 .com
und dann 0 oder mehr Leerzeichen.
Andere Möglichkeiten:
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
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, .com
sondern auch .fr
oder .uk
kö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 .xyz
nach 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).