[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 (1. Mai 2014 um 11:47)

  • 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
    Meine VDRs

    VDR 1: Point of View Ion-330-1, 2x Sundtek MediaTV Pro (DVB-C), Atric IR-Einschalter Rev.5, Ubuntu 18.04 (yavdr-ansible)
    VDR 2: Acer Revo 3610, Pinnacle PCTV SAT 452e, Medion X10, yaVDR 0.6
    VDR 3: Intel DH67BL, Celeron 540, 4 GB Ram, POV Geforce GT 1030, Ubuntu 18.04 (yavdr-ansible), VDR 2.4.1, CIR-Empfänger
    Client 1: Raspberry Pi 2, Arch Linux ARM, VDR 2.3.8
    vdr-epg-daemon auf Cubietruck mit 32 GB SSD, Arch Linux ARM

    yaVDR-Dokumentation (Ceterum censeo enchiridia esse lectitanda.)

  • 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?


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

    Danke und Grüße
    Fux

    Ciao.
    Michael.

    VDR zwei drei
    • VDR 01 (Server): 2.7.2 4 x TT Budget S2-3200
      Plugins: [channellists - control - epgsearch - live - markad - streamdev-server - tvscraper]
    • VDR 02 (Client): 2.6.9 1 x TT Premium S2-6400 (HDMI an TV), 1 x softhddevice (HDMI an TV); TV Grundig 40 VLE 8160 SL; TFT-Display Origen AE 16T
      Plugins: [channellists - control - dvbhddevice - epgsync - graphtftng - mpv - osd2web - osdteletext - skinnopacity - softhddevice - streamdev-client - svdrpservice]
  • Oder ohne externe Programme:

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

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

    Kanallogos: Picon.cz2VDR | Picons2VDR | MP-Logos
    Backupskripte: MV_Backup (RSync) | MV_BorgBackup (Borg
    Skin: Skin FlatPlus  VDR-Add_MSGT

    "Es gibt keinen Grund, warum irgendjemand einen Computer in seinem Haus wollen würde."
    [Ken Olson], Präsident der Digital Equipment Corp., 1977

    VDR01 - yaVDR 0.7 (VDR 2.7.3)

    VDR 2.7.3; Gehäuse: Antec Fusion V2 Black & iMon LCD; Atric IR-Einschalter Rev. 4; Board: Intel DH77EB, Core i5-3550, GTX 1050 Ti, 8 GB RAM; DVB: 1x Digital Devices CineS2 Quad V6.5

    >Systeminfo.txt< [VDR-User #1540]

  • 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.

    VDR zwei drei
    • VDR 01 (Server): 2.7.2 4 x TT Budget S2-3200
      Plugins: [channellists - control - epgsearch - live - markad - streamdev-server - tvscraper]
    • VDR 02 (Client): 2.6.9 1 x TT Premium S2-6400 (HDMI an TV), 1 x softhddevice (HDMI an TV); TV Grundig 40 VLE 8160 SL; TFT-Display Origen AE 16T
      Plugins: [channellists - control - dvbhddevice - epgsync - graphtftng - mpv - osd2web - osdteletext - skinnopacity - softhddevice - streamdev-client - svdrpservice]

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

    du warst zu schnell :))

    VDR zwei drei
    • VDR 01 (Server): 2.7.2 4 x TT Budget S2-3200
      Plugins: [channellists - control - epgsearch - live - markad - streamdev-server - tvscraper]
    • VDR 02 (Client): 2.6.9 1 x TT Premium S2-6400 (HDMI an TV), 1 x softhddevice (HDMI an TV); TV Grundig 40 VLE 8160 SL; TFT-Display Origen AE 16T
      Plugins: [channellists - control - dvbhddevice - epgsync - graphtftng - mpv - osd2web - osdteletext - skinnopacity - softhddevice - streamdev-client - svdrpservice]
  • du warst zu schnell :))


    hm, oder auch nicht - wie meinst du das?

    Ciao.
    Michael.

    VDR zwei drei
    • VDR 01 (Server): 2.7.2 4 x TT Budget S2-3200
      Plugins: [channellists - control - epgsearch - live - markad - streamdev-server - tvscraper]
    • VDR 02 (Client): 2.6.9 1 x TT Premium S2-6400 (HDMI an TV), 1 x softhddevice (HDMI an TV); TV Grundig 40 VLE 8160 SL; TFT-Display Origen AE 16T
      Plugins: [channellists - control - dvbhddevice - epgsync - graphtftng - mpv - osd2web - osdteletext - skinnopacity - softhddevice - streamdev-client - svdrpservice]
  • wie meinst du das?

    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/'
  • 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.

    VDR zwei drei
    • VDR 01 (Server): 2.7.2 4 x TT Budget S2-3200
      Plugins: [channellists - control - epgsearch - live - markad - streamdev-server - tvscraper]
    • VDR 02 (Client): 2.6.9 1 x TT Premium S2-6400 (HDMI an TV), 1 x softhddevice (HDMI an TV); TV Grundig 40 VLE 8160 SL; TFT-Display Origen AE 16T
      Plugins: [channellists - control - dvbhddevice - epgsync - graphtftng - mpv - osd2web - osdteletext - skinnopacity - softhddevice - streamdev-client - svdrpservice]
  • 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!