Shell StringManipulation/ -extraktion



  • Hallo,

    ich habe eine recht banale Frage zur extraktion eines Strings in der Shell.

    Ich möchte eine Datei einlesen, daraus einen string extrahieren und in einer Variablen speichern.

    Da der String in Anführungszeichen steht sollte das eigentlich kein Problem sein, trotzdem überfordert mich das ganze etwas.

    // Den string in Anf.zeichen hätt ich gerne in einer Variablen
    
    <REF HREF = "mms://mercury.radica.com/festival3/current_streams/breaks/breaks_ninja_090109h.wma" />
    

    Danke



  • Die Anführungszeichen brauche ich nicht 😉



  • Nachtrag 2:

    Die betreffende Zeile ist nicht die einzige in der Datei.
    Aber die für mich einzig interessante. 😃



  • FILENAME=$(cat foo|sed 's/<REF\s*HREF\s*=\s*"//'|sed 's/".*//')
    

    wobei foo der Name der Datei ist.



  • und falls die Datei foo noch andere Zeilen hat:

    FILENAME=$(cat foo|grep '<REF HREF'|sed 's/<REF\s*HREF\s*=\s*"//'|sed 's/".*//')
    


  • OK. Danke, das sieht in der Tat erst mal relativ kryptisch aber auch vielversprechend aus. Hoffentlich verstehe ich auch bald was ich da machen werde 😞



  • is' doch ganz einfach:

    FILENAME=$(cat foo|grep '<REF HREF'|sed 's/<REF\s*HREF\s*=\s*"//'|sed 's/".*//')
    

    Der Variablen FILENAME wird zugewiesen die Ausgabe der Pipeline, die in $(...) steht.

    Mit grep sucht man sich die Zeile(n) mit <REF HREF heraus.

    sed 's/foo/bla/' ersetzt foo durch bla. Hier noch angereichert mit \s* (steht für beliebig viel whitespace) und .* (steht für beliebige Zeichenfolge).

    Das erste sed in der Pipe ersetzt <REF HREF = " (mit beliebigem whitespace dazwischen) durch 'gar nichts', das zweite sed ersetzt die Anführungszeichen " und alle folgenden Zeichen durch 'gar nichts'.

    Übrig bleibt in $(...) also der Dateiname.



  • Danke, ausführlich. Da schämt man sich fast, daß man Hilfe braucht... 😉



  • u_ser-l schrieb:

    is' doch ganz einfach:

    FILENAME=$(cat foo|grep '<REF HREF'|sed 's/<REF\s*HREF\s*=\s*"//'|sed 's/".*//')
    

    Der Variablen FILENAME wird zugewiesen die Ausgabe der Pipeline, die in $(...) steht.

    Mit grep sucht man sich die Zeile(n) mit <REF HREF heraus.

    sed 's/foo/bla/' ersetzt foo durch bla. Hier noch angereichert mit \s* (steht für beliebig viel whitespace) und .* (steht für beliebige Zeichenfolge).

    Das erste sed in der Pipe ersetzt <REF HREF = " (mit beliebigem whitespace dazwischen) durch 'gar nichts', das zweite sed ersetzt die Anführungszeichen " und alle folgenden Zeichen durch 'gar nichts'.

    Übrig bleibt in $(...) also der Dateiname.

    Ein gutes Beispiel für "useless use of cat". Statt

    cat foo|grep '<REF HREF'
    

    ginge auch

    grep '<REF HREF' foo
    

    oder im ersten Beispiel ist noch ein überflüssiger doppelter sed-Aufruf drin. Stat

    cat foo|sed 's/<REF\s*HREF\s*=\s*"//'|sed 's/".*//'
    

    einfacher

    sed 's/<REF\s*HREF\s*=\s*"//; s/".*//' foo
    

    Alles ungetestet, aber das Prinzip sollte klar sein.


Anmelden zum Antworten