sed



  • Hallo Leute.

    Ich will mit sed eine Versionsnummer aus einer Zeile auslesen:
    Die Zeile sieht etwa so aus:

    bla3.2blup

    dh, 3.2 ist die Versionsnummer und bla/blup sind uninteressante (aber immer gleiche) Teile des Versionsstrings.

    Mein Versuch mit

    echo bla3.2blup | sed 's/bla\([0-9\.]+\)blup/\1/'
    

    hat mir wieder das komplette "bla3.2blup" ausgegeben.

    Lustigerweise funktioniert ein

    echo bla3.2blup | sed 's/bla\(3\.2\)blup/\1/'
    

    aber korrekt und gibt mir "3.2" aus.

    Wie muss es korrekt lauten?



  • # deiner
    $ echo bla3.2blup | sed 's/bla\([0-9\.]+\)blup/\1/'
    
    # meiner
    $ echo bla3.2blup | sed 's/bla\([0-9\.]\+\)blup/\1/'
    

    Du musst + escapen, damit nicht "+" sondern "mind. 1" matchen kann. (boah, schrecklich dieses denglish)



  • supertux schrieb:

    Du musst + escapen, damit nicht "+" sondern "mind. 1" matchen kann. (boah, schrecklich dieses denglish)

    Danke. Verstehe ich zwar nicht ganz, warum man da soviel immer escapen muss, bei Perl und Konsorten ist das Escapen ja genau umgekehrt. Aber leider funktioniert es immer noch nicht:

    $ echo bla3.2blup | sed 's/bla\([0-9\.]\+\)blup/\1/'
    bla3.2blup
    

    PS:
    ich verwende OS X, dh also ein BSD sed. Versionsnummer hab ich leider keine Ahnung da sed ja kein --version oder dergleichen kann.



  • Also, bei mir gehts:

    $ echo bla3.2blup | sed 's/bla\(3\.2\)blup/\1/'
    3.2
    $ sed --version
    GNU sed version 4.2.1
    Copyright (C) 2009 Free Software Foundation, Inc.
    This is free software; see the source for copying conditions.  There is NO
    warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE,
    to the extent permitted by law.
    
    GNU sed home page: <http://www.gnu.org/software/sed/>.
    General help using GNU software: <http://www.gnu.org/gethelp/>.
    E-mail bug reports to: <bug-gnu-utils@gnu.org>.
    Be sure to include the word ``sed'' somewhere in the ``Subject:'' field.
    

    du benutzt auch MacOS, oder? Was für ein sed ist da installiert?



  • supertux schrieb:

    du benutzt auch MacOS, oder? Was für ein sed ist da installiert?

    ja, OS X 10.6. Der Code muss aber auch auf 10.5 und 10.4 laufen. Aber Apple tut an den BSD Tools eh so gut wie nie was ändern.

    und BSD sed kann leider kein --version

    Die manpage ist vom 10. May 2005 - falls das hilft.



  • ne, das hilft mir nicht weiter 😉 vielleicht gibt es auf der man-page Hinweise, wie man für diese Version Regular Expresions baut (die awk man-page hat sowas z.B.).

    Muss es unbedingt [0-9\.]+ sein? Würde es nicht [0-9\.]* genügen?

    edit://
    wie wäre es damit?

    sed -e 's/[^0-9\.]//g'
    

    bei mir zumindest:

    $ echo bla3.2blup | sed -e 's/[^0-9\.]//g'
    3.2
    


  • supertux schrieb:

    ne, das hilft mir nicht weiter 😉 vielleicht gibt es auf der man-page Hinweise, wie man für diese Version Regular Expresions baut (die awk man-page hat sowas z.B.).

    Muss es unbedingt [0-9\.]+ sein? Würde es nicht [0-9\.]* genügen?

    Es genügt auch [0-9.] statt [0-9\.]. Das ist sogar korrekter, denn [0-9\.] matcht die Ziffern 0 bis 9 sowie die beiden Zeichen "\" und ".". (edit: Es matcht Backslash und Punkt. Aus irgendeinem Grund verschluckt das Forum den Backslash, den ich eingebe.) Bei regexp verlieren innerhalb von character sets fast alle Zeichen ihre Sonderbedeutung, den Punkt muss man dort nicht escapen.



  • supertux schrieb:

    ne, das hilft mir nicht weiter 😉 vielleicht gibt es auf der man-page Hinweise, wie man für diese Version Regular Expresions baut (die awk man-page hat sowas z.B.).

    Inoffizieller Workaround für FreeBSD war mach ein grep über die Sourcen...
    Die hab ich aber logischerweise nicht.

    Muss es unbedingt [0-9\.]+ sein? Würde es nicht [0-9\.]* genügen?

    Muss nicht, * tut es auch und damit funktioniert es auch:

    $ echo bla3.2blup | sed 's/bla\([0-9\.]*\)blup/\1/'
    3.2
    

    Danke 🙂

    Weisst du zufällig auch warum es damit funktioniert und ich * nicht escapen muss?

    PS:
    danke auch an Christoph.



  • supertux schrieb:

    wie wäre es damit?

    sed -e 's/[^0-9\.]//g'
    

    Das geht leider nicht, da ich nicht alle Ziffern aus dem Versionsstring auslesen will. zB die Jahreszahl steht dort auch drinnen. Die ist uninteressant.



  • Shade Of Mine schrieb:

    Weisst du zufällig auch warum es damit funktioniert und ich * nicht escapen muss?

    es tut funktionieren, weil [0-9\.]* sagt, dass es keine oder mehrere Zeichen aus der Liste hintereinander kommen dürfen. Da du ja gezielt eine Zeile parst, wo die Versin sich befindet (also nicht leer), genügt das.

    Warum man für "keine oder mehrere" nicht escpaen muss, keine Ahnung. Scheint nicht ganz so konsistent zu sein.

    Christoph schrieb:

    Es genügt auch [0-9.] statt [0-9\.]. Das ist sogar korrekter, denn [0-9\.] matcht die Ziffern 0 bis 9 sowie die beiden Zeichen "\" und ".". (edit: Es matcht Backslash und Punkt. Aus irgendeinem Grund verschluckt das Forum den Backslash, den ich eingebe.) Bei regexp verlieren innerhalb von character sets fast alle Zeichen ihre Sonderbedeutung, den Punkt muss man dort nicht escapen.

    hhäääämmmm, das wusste ich nicht. Schön, man lernt jeden Tag was Neues.


Anmelden zum Antworten