Moin,
innerhalb eines regulären Ausdrucks kann man das wohl nicht abbilden, aber mit Hilfe des sed trotzdem in einem Rutsch prüfen:
Code:
echo 'email@test.adresse.de' | \
sed -rn '/^[A-Za-z0-9_-]{1,100}@[A-Za-z0-9_.-]{1,200}/{
s/.+@//
: lbl
s/^[A-Za-z0-9_-]{1,50}\.//
t lbl
/^[A-Za-z0-9_-]{1,50}$/=}'
Der sed wird mit den Optionen für extended regex und "halts Maul" (keine Ausgabe) gestartet.
Im sed läuft folgendes ab:
Zeile 1- führe die Kommandos in den {} nur aus, wenn die Eingabe aus max. 100 Buchstaben, Ziffern, "_" oder "-" vor dem Klammeraffen und max. 200 Buchstaben, Ziffern, "_", "-" und "." nach dem Klammeraffen besteht
Zeile 2 - entferne alles inkl. Klammeraffe, übrig bleibt der Domain-Anteil.
Zeile 3 - definiere eine Sprungmarke "lbl"
Zeile 4 - entferne vom Beginn des Rests alle Buchstaben, Ziffern, "_" oder "-", die max. 50 Zeichen lang sind und von einem Punkt gefolgt werden. Damit wird ein nach Deiner Definition gültiger Domainpart am Anfang entfernt.
Zeile 5 - wenn in Zeile 4 eine Ersetzung stattgefunden hat, dann springe zurück zur Sprungmarke "lbl". Damit wird in einer Schleife jeder gültige Domainteil bis auf den letzten nacheinander entfernt
Zeile 6 - wenn der verbliebene Rest nur aus Buchstaben, Ziffern, "_" oder "-" besteht, dann gib die Zeilennummer aus.
Wenn Du den sed aufrufst, dann kriegst Du nur dann eine "1" zu sehen, wenn die Adresse Deinen Anforderungen genügt, ansonsten wird nichts ausgegeben. Das kannst Du dann so testen:
Code:
if test -n "`echo ... | sed '...'`"; then
echo OK
else
echo Fehler
fi
Bitte noch durchtesten, ich habs nur oberflächlich gemacht.
Noch ein Hinweis: Die Einzelregex müssten eigentlich noch verfeinert werden - am Beginn einer Adresse oder eines Domainteils darf z. B. kein "_" oder "-" stehen.
Jan
P.S.: Wenn Du Dir genauer angucken willst, was der sed macht, dann setze jeweils an das Ende der sed-Zeilen 2 und 4 die Zeichenfolge ";p", damit wird Dir ausgegeben, was nach den Ersetzungen übrig bleibt.
EDIT: Noch eine Variante - praktisch, wenn Du aus einer Datei eine Liste von Adressen prüfen willst. Ich habe den sed-Teil mal in eine eigene Scriptdatei gepackt:
Code:
jan@jack:~/tmp> cat chk_addr.sed
/^[A-Za-z0-9_-]{1,100}@[A-Za-z0-9_.-]{1,200}/{
h
s/.+@//
: lbl
s/^[A-Za-z0-9_-]{1,50}\.//
t lbl
/^[A-Za-z0-9_-]{1,50}$/{g;p}
}
jan@jack:~/tmp> sed -rnf chk_addr.sed adressen.txt
email@meine.adresse.de
e_mail-addr@meine2.mail_adresse.de
Neu ist die Zeile 2: Der Inhalt der Adresse wird vor dem Zerpflücken in den Haltepuffer kopiert. In der letzten Zeile des sed-Scripts wird dann bei Erfolg der Haltepuffer wieder zurückgeholt und dann ausgegeben. Damit gibt das sed-Kommando dann nur die gültigen Adressen aus der Datei "adressen.txt" aus.
Lesezeichen