String zerlegen in der Shell

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
feltel
Webmaster
Beiträge: 10471
Registriert: 20.12.2001 13:08:23
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Leipzig, Germany
Kontaktdaten:

String zerlegen in der Shell

Beitrag von feltel » 11.01.2006 18:27:44

Ich steh irgendwie gerade auf dem Schlauch. Gegeben ist der folgende String:

Code: Alles auswählen

-f user@senderdomain.tld -- user@empfaengerdomain.tld
Diesen String will ich auf "empfaengerdomain.tld" kürzen, so das ich in einem Script Vergleiche darauf anwenden kann.

Ihr fragt jetzt sicher wieso das ganze. Es geht um ein "automatische Signatur an jede ausgehende eMail anhängen"-Setup unter Postfix. Dies würde optimal nur laufen wenn man für incoming und outgoing Traffic je ne extra IP hat. Das kann ich auf die schnelle aber nicht umsetzen und so will ich in dem Filter-Shellscript checken ob empfaengerdomain.tld ne lokale Domain ist und wenn ja die Signatur nicht dranhängen.

Benutzeravatar
Joghurt
Beiträge: 5244
Registriert: 30.01.2003 15:27:31
Wohnort: Hamburg
Kontaktdaten:

Beitrag von Joghurt » 11.01.2006 18:41:09

Code: Alles auswählen

echo ... | sed -e 's/.*@//'

Benutzeravatar
C_A
Beiträge: 1082
Registriert: 22.04.2004 14:51:01
Lizenz eigener Beiträge: GNU General Public License

Beitrag von C_A » 11.01.2006 18:44:39

oder:

Code: Alles auswählen

cut -d"@" -f3
:)

Benutzeravatar
Joghurt
Beiträge: 5244
Registriert: 30.01.2003 15:27:31
Wohnort: Hamburg
Kontaktdaten:

Beitrag von Joghurt » 11.01.2006 18:53:51

Falls du aus "ABC foobar@example.org DEF -- GHI god@universe.org blabla" ein "example.org universe.org" machen willst, wäre ein

Code: Alles auswählen

sed -re 's/[^@]*@([^ ]+ ?)[^@]*/\1/g'
das richtige.

Falls du "ABC example.org DEF -- GHI universe.org blabla" haben willst, musst du

Code: Alles auswählen

sed -re 's/[^@ ]*@([^ ]+)[^@ ]*/\1/g'
nehmen. Das ganze setzt natürlich vorraus, das keine Tabs vorkommen.

Benutzeravatar
feltel
Webmaster
Beiträge: 10471
Registriert: 20.12.2001 13:08:23
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Leipzig, Germany
Kontaktdaten:

Beitrag von feltel » 11.01.2006 18:59:45

Noch n kleines Problem, scheinbar ist heute nicht mein Tag :-( Wie teste ich jetzt in der Shell auf mehrere Domains, sprich

Code: Alles auswählen

if [$EMPFAENGERDOMAIN != domain1.tld, domain2.tld]; then

Benutzeravatar
feltel
Webmaster
Beiträge: 10471
Registriert: 20.12.2001 13:08:23
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Leipzig, Germany
Kontaktdaten:

Beitrag von feltel » 11.01.2006 19:06:26

Hat sich erledigt. Erst denken dann schreiben. :oops:

Benutzeravatar
Joghurt
Beiträge: 5244
Registriert: 30.01.2003 15:27:31
Wohnort: Hamburg
Kontaktdaten:

Beitrag von Joghurt » 11.01.2006 19:31:49

feltel hat geschrieben:Erst denken dann schreiben. :oops:
Hätte Dieter Bohlen das nur so gemacht...

Benutzeravatar
feltel
Webmaster
Beiträge: 10471
Registriert: 20.12.2001 13:08:23
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Leipzig, Germany
Kontaktdaten:

Beitrag von feltel » 11.01.2006 20:12:12

Hmm, irgendwie haut das doch noch nicht hin.

Code: Alles auswählen

LOCALDOMAIN=`echo $@ | sed -e 's/.*@//'`

# Start processing.
cd $INSPECT_DIR || { echo $INSPECT_DIR does not exist; exit
$EX_TEMPFAIL; }

cat >in.$$ || { echo Cannot save mail to file; exit $EX_TEMPFAIL; }


#if [ $LOCALDOMAIN != domain.de -o $LOCALDOMAIN != domain2.de ]; then

if [ $LOCALDOMAIN != "domain.de" ]; then
echo "matching $LOCALDOMAIN" >> /tmp/postfix.txt

/usr/local/bin/altermime --input=in.$$ \
        --disclaimer=/etc/postfix/signature.txt \
        --disclaimer-html=/etc/postfix/signature.html || \
        { echo Message content rejected; exit $EX_UNAVAILABLE; }
fi

$SENDMAIL "$@" <in.$$
Mit dem auskommentierten if-Statement wird altermime nie ausgeführt, mit dem ohne Kommentarzeichen immer, obwohl $LOCALDOMAIN auch "domain.de" enthielt, wie ich in dem postfix.txt Tempfile nachgelesen hab. Seltsam.

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von gms » 11.01.2006 21:27:57

Code: Alles auswählen

if [ $LOCALDOMAIN != domain.de -o $LOCALDOMAIN != domain2.de ]; then"
diese Bedingung ist immer erfüllt (egal was in LOCALDOMAIN drinnen steht ist entweder der linke oder der rechte Vergleich erfüllt)

Komisch ist jetzt nur, daß sich das jetzt überhaupt nicht mit deiner Fehlerbeschreibung deckt :(
altermime sollte eigentlich mit dieser if Answeisung immer aufgerufen werden

vermutlich möchtest du diese Abfrage:

Code: Alles auswählen

if [ $LOCALDOMAIN != domain.de -a $LOCALDOMAIN != domain2.de ]; then"
diese Bedingung ist nur erfüllt, wenn in LOCALDOMAIN weder "domain.de" noch "domain2.de" drinnen steht:

Gruß
gms

Benutzeravatar
Savar
Beiträge: 7174
Registriert: 30.07.2004 09:28:58
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Berlin

Beitrag von Savar » 11.01.2006 22:30:23

grmpf grmpf grmpf... dachte das feltel es noch reinschreibt.. ja gms du hast Recht, das hatte ich ihm vor ner Stunde auch schon gesagt.. naja.. und dann rief sein Fernseher und er hats hier nicht mehr verewigt ;-)
MODVOICE/MYVOICE
Debianforum Verhaltensregeln
Log Dateien? -> NoPaste

Benutzeravatar
feltel
Webmaster
Beiträge: 10471
Registriert: 20.12.2001 13:08:23
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Leipzig, Germany
Kontaktdaten:

Beitrag von feltel » 12.01.2006 06:51:43

Ja, ich hatte gestern noch mit Savar gechattet und er hat mir meinen Denkfehler gezeigt. Die Tests müssen alle mit Tests mit true durchlaufen, also wenn sie mit AND verkettet sind. Das war mein Fehler.

Antworten