[Bash] Führende Null aus Teilstring ausschneiden

  • Hallo,


    ich habe einen String der wie folgt aussieht, zwei Beispiele:

    Code
    "Beliebiger Text 01"
    "Ein anderer Beispieltext 03"


    Wenn der letzte Teilstring aus einer Zahl besteht (ist nicht immer so), dann soll die führende Null der Zahl entfernt werden.


    Ziel ist also:

    Code
    "Beliebiger Text 1"
    "Ein anderer Beispieltext 3"


    Wer kann mir einen Tipp geben?


    Danke und Grüße
    Fux

    Hardware: Asus M3N78-EM µATX GF 8300 | AMD Sempron 140 | Display VFD USB MDM166A | DVB-S2 TT-3600 USB | RAM 1 GB | WD20EARS 2 TB
    Software: yaVDR 0.5

    2 Mal editiert, zuletzt von Fux ()

  • Man kann das z.B. so machen:

    Code
    $ echo "Beliebiger Text 01" | sed -r 's/^(.*)(\s+)([0-9]+)$/echo -n "\1\2"; echo $(printf "%d" \3)/e'
    Beliebiger Text 1


    Oder in Python


    Das sieht dann so aus:

    Code
    $ python prettyprintstring.py "Beliebiger Text 01"
    Beliebiger Text 1

    yaVDR-Dokumentation (Ceterum censeo enchiridia esse lectitanda.)


  • var=$( echo "$text" | sed -r -e 's/(\s+)0+([1-9]+)/\1\2/g' )


    Danke und Grüße
    Fux


    Ciao.
    Michael.

  • Oder ohne externe Programme:

    Code
    ${string%substring}
    
    
    	Deletes shortest match of $substring from back of $string.

    Quelle: http://j.mp/1u8ypvy

  • sowas macht man mit awk :)



    liefert


    Code
    Beliebiger Text 1
    Ein anderer Beispieltext 3
    Ein anderer Beispieltext 3
    Ein anderer Beispieltext 4
    Ein anderer Beispieltext0 45
    Ein anderer Beispieltext0 777
    Ein anderer Beispieltext0 7770
    Ein anderer Beispieltext
    Ein
  • dieses Program ist nicht richtig. Bei Input von z.B. 'Ein anderer Beispieltext0 07770s' wird eine Null abgeschnitten, obwohl am Schluss keine Zahl steht


    jo, ich hatte überlesen, dass das nur passieren soll, wenn es der letzte Teilstring ist.


    Dann halt:


    var=$( echo "$text" | sed -r -e 's/(\s+)0+([0-9]+)$/\1\2/' )


    Oder?


    Ciao.
    Michael.


  • stimmt auch noch nicht ganz:-) weil eingebettete Nullen den Match verhindern


    du warst zu schnell :))

  • du warst zu schnell :))


    hm, oder auch nicht - wie meinst du das?


    Ciao.
    Michael.

  • wenn du schreibst

    Code
    's/(\s+)0+([0-9]+)$/\1\2/'


    dann ist nicht eindeutig, welche Nullen zu '0+' oder bereits zu [0-9]+ zaehlen sollen. Deswegen ist es besser zu schreiben

    Code
    's/(\s+)0+([1-9][0-9]*)$/\1\2/'


    Jo, das stimmt.
    Allerdings geht aus der Frage nicht hervoor, ob auch mehr als eine führende Null entfernt werden soll.
    Und da ist der Ausdruck ja "greedy", d.h. alle führenden Nullen werden von 0+ erfasst.



    Ciao.
    Michael.

  • Hallo zusammen,


    Danke für die vielen Antworten!
    Den Fall mit mehreren voranstehenden Nullen gibt es nicht, immer nur maximal eine voranstehende 0 oder keine.


    Viele Grüße
    Fux

    Hardware: Asus M3N78-EM µATX GF 8300 | AMD Sempron 140 | Display VFD USB MDM166A | DVB-S2 TT-3600 USB | RAM 1 GB | WD20EARS 2 TB
    Software: yaVDR 0.5

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!