
Ich habe eine Textdatei mit einer E-Mail-Adresse pro Zeile. Wie kann ich den Domänenteil, aber nicht den TLD-Teil jeder Zeile entfernen? Hier würden wir TLD als letztes Element der Zeichenfolge nach dem letzten Punktzeichen definieren.
Mit anderen Worten, Beispieleingabe:
[email protected]
[email protected]
[email protected]
[email protected]
Gewünschte Ausgabe:
foobar@org
john.smith@com
chunkylover69@dk
qwerty@uk
Antwort1
$ sed 's/@.*[.]/@/' file
foobar@org
john.smith@com
chunkylover69@dk
qwerty@uk
Der reguläre Ausdruck @.*[.]
erfasst alles von @
bis zum letzten Punkt .
in der Zeile. Das ersetzen wir durch @
.
Antwort2
Verwenden vonperl
perl -pe 's/(@).*\.(.*)$/\1\2/' foo
oder inline
perl -i -pe 's/(@).*\.(.*)$/\1\2/' foo
Beispiel
$ cat foo
[email protected]
[email protected]
[email protected]
[email protected]
$ perl -pe 's/(@).*\.(.*)$/\1\2/' foo
foobar@org
john.smith@com
chunkylover69@dk
qwerty@uk
RegEx-Erklärung
/(@).*\.(.*)$/
1. Erfassungsgruppe (
@
)@
@
entspricht wörtlich dem Charakter.*
passt zu jedem Zeichen (außer Newline)Quantifizierer:
*
Zwischen null und unbegrenzt oft, so oft wie möglich, Rückgabe nach Bedarf [gierig]\.
.
entspricht wörtlich dem Charakter2. Erfassungsgruppe (
.*
).*
passt zu jedem Zeichen (außer Newline)Quantifizierer:
*
Zwischen null und unbegrenzt oft, so oft wie möglich, Rückgabe nach Bedarf [gierig]$
Position am Ende der Zeichenfolge bestätigen
Antwort3
So awk
geht's
$awk '{ sub(/\@.*\./,"@"); print }' file
foobar@org
john.smith@com
chunkylover69@dk
qwerty@uk
Mit sub
Substitute (Suchen und Ersetzen) können Sie nach einem Muster suchen und es ersetzen.