Ergebnis von sed in Variable schreiben

P

panzaeron

Jungspund
Hallo,

ich hab in einem Shellskript mal wieder ein Problem mit sed :(

Aus einer Text-Datei möchte ich eine E-Mail-Adresse auslesen und in eine neue Variable zu schreiben. Die Zeile mit der E-Mail-Adresse hat folgenden Aufbau:
(ein paar Tabs+Leerzeichen)Subject: (Text)/emailAddress=Test@Adresse.de

Die Zeile mit der korrekten Adresse kann durch die Begriffe "Subject: " und "emailAddress=" in einer Zeile identifiziert werden.

Daher habe ich folgendes Konstrukt gebaut:
Code:
EMAIL = `sed 's|Subject:\s.+/emailAddress=\(.+\)$|\1|' Dateiname`

Leider wird immer die ganze Datei in die Variable geschrieben und ich finde den Fehler nicht :(

Hat einer Idee, warum es so nicht funktioniert und was ich ändern muss?
 
Hallo panzaeron

So spontan würd ich sagen, deine RegExp matcht nicht, dann gibt 'sed' nämlich einfach alles wieder aus. um das zu verhindern kannst du '-n' und 'p' verwenden. Siehe dazu 'man sed'.
Code:
sed -n 's|Subject:\s.*/emailAddress=\(.*\)$|\1|p' test
Probiers mal so, das scheint zu matchen...

Gruss
d22
 
Vielen dank dizzgo,
leider greift auch diese RegEx nicht, immerhin wird jetzt nichts mehr ausgegeben.
Allerdings weiß ich momentan nicht wieso die nicht greift, sieht eigentlich ganz logisch aus. Noch eine Idee?
 
Poste mal deine Input-Datei, oder einen Ausschnitt daraus.
 
Gerne, hier also ein Beispiel für den Aufbau der Datei:
Code:
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number: 11 (0xb)
        Signature Algorithm: md5WithRSAEncryption
        Issuer: C=DE, ST=Niedersachsen, L=Stadt, O=Name/emailAddress=test@email1.de
        Validity
            Not Before: Jan  4 11:46:05 2007 GMT
            Not After : Jan  1 11:46:05 2017 GMT
        Subject: C=DE, ST=Niedersachsen, O=Organisation, CN=Vor- und Nachnahme/emailAddress=test@testmail.de
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
            RSA Public Key: (1024 bit)
                Modulus (1024 bit):
...

Aus dieser Zeile möchte ich die E-Mail-Adresse ********** haben:
Code:
Subject: C=DE, ST=Niedersachsen, O=Organisation, CN=Vor- und Nachnahme/emailAddress=test@testmail.de
 
Hi,

wie wärs mal damit
EMAIL = $(sed 's|Subject:\s.+/emailAddress=\(.+\)$|\1|' Dateiname)

Mfg

Sebi
 
wie wärs mal damit
EMAIL = $(sed 's|Subject:\s.+/emailAddress=\(.+\)$|\1|' Dateiname)

Nein die Backticks sind nicht das Problem. Das Matching ist das Problem.
Und eine Variablenzuweisung in der Bash a la

var = abc

funktioniert schon garnicht. Wenn dann schon so:

var=abc

@panzaeron
Welche sed Version hast Du denn?
 
@rikola
Mit grep habe ich es auch schon versucht und zwar sowas:
Code:
EMAIL=`grep 'Subject:' Dateiname.txt|sed 's/emailAddress=\(.+\)/\1/'`
Dann wird aber wieder die ganze Zeile ausgegeben bzw. bei Verwendung von -n und p nichts.

@Schlaubi_fi.de
Ich verwende einen Debian Sarge mit GNU sed Version 4.1.2
 
@rikola
Mit grep habe ich es auch schon versucht und zwar sowas:
Code:
EMAIL=`grep 'Subject:' Dateiname.txt|sed 's/emailAddress=\(.+\)/\1/'`
Dann wird aber wieder die ganze Zeile ausgegeben bzw. bei Verwendung von -n und p nichts.

@Schlaubi_fi.de
Ich verwende einen Debian Sarge mit GNU sed Version 4.1.2

Dann picke Dir Zeile doch mit grep zu und veraendere sie dann mit sed. Dann brauchst Du auch kein '-n' und '/p' (was bei mir uebrigens auch nicht funktioniert hat, Debian etch, GNU sed 4.1.2)
 
@rikola
Die Idee ist gut, funktioniert aber auch nicht. Folgendes habe ich probiert:
Code:
EMAIL=$(grep 'Subject:' Dateiname|sed 's/.*emailAddress=//')
Zurückgegeben wird wieder die ganze Zeile, sprich sed greift nicht. Aber warum? Eigentlich sollte doch alles bis zum Gleichheitszeichen gelöscht werden und dadurch die E-Mail-Adresse übrig bleiben?
 
Dizzgo weißt auch da nichts zu, sondern gibt die Emailadresse via Backreferencing aus.
Bei mir matched der so wie er soll... :think:

Was ist Backreferencing? Zur Info ich meinte nicht Dizzgo, sondern panzaeron und Giglio!!

Also ich denke so sollte es funktionieren!!

Code:
user@host:~> sed --version
GNU sed Version 4.1.5
Copyright (C) 2003 Free Software Foundation, Inc.
(Der folgende Text ist eine nicht überprüfte Übersetzung, die zur
 Information dient;  in rechtlichen Fragen ist immer das englische
 Original ausschlaggebend)

Dieses Program ist freie Software; In den Quelldateien können Sie die
Bedingungen für die Weitergabe nachlesen.
Es gibt KEINE GARANTIE; nicht einmal die implizite Garantie der
MARKTFÄHIGKEIT oder der ERFÜLLUNG EINES BESTIMMTEN ZWECKES.


user@host:~> cat <<-EOF | sed -n 's|.*Subject:.*/emailAddress=\(.+\)*|\1|p'
Certificate:
     Data:
         Version: 3 (0x2)
         Serial Number: 11 (0xb)
         Signature Algorithm: md5WithRSAEncryption
         Issuer: C=DE, ST=Niedersachsen, L=Stadt, O=Name/emailAddress=test@email1.de
         Validity
             Not Before: Jan  4 11:46:05 2007 GMT
             Not After : Jan  1 11:46:05 2017 GMT
         Subject: C=DE, ST=Niedersachsen, O=Organisation, CN=Vor- und Nachnahme/emailAddress=test@testmail.de
         Subject Public Key Info:
             Public Key Algorithm: rsaEncryption
             RSA Public Key: (1024 bit)
                 Modulus (1024 bit):
EOF

Folglich muesste es lauten:

Code:
EMAIL="$(sed -n 's|.*Subject:.*/emailAddress=\(.+\)*|\1|p' dateiname)"
 
Zuletzt bearbeitet:
@all
Vielen Dank für eure Hilfe und besondere an Schlaubi_fi.de der letzte Tip funktioniert bei mir auch :)

Nochmal vielen Dank, ein super Forum :)
 
Phu, ist man mal 2h nicht im Forum, hat man schon die ganze Diskussion verpasst :D! Ist ja wieder mal schnell gegangen...

Grüsse
 

Ähnliche Themen

SED und TCPDUMP

Text mit mehreren Zeilen und Sonderzeichen ersetzten

Zeilen kopieren mit SED

Leerzeichen, Großbuchstaben, HTML Tags entfernen mittels SED

Zeielenblock von einer Datei in eine neue schreiben

Zurück
Oben