[gelöst] Bash Script => Datei auslesen (Zeilenweise) und Suchen/Ersetzen

  • Hi !


    Nachdem ich durch das schon eiin wenig weiter bin noch 2i-3 Fragen.


    Ich will/muss ein bash script erstellen (bash weil ich nicht weiss wie der Zielrechner irgendwann mal aussieht.. ausser das Linux drauf ist)


    1. Ich will eine Datei zeilenweise auslesen und dden Inhal jeder Zeile bis zu einem bestimmten Punkt/Trenner im script als Variable nutzen
    2. Will mit dem Inhalt dieser Variable in einer Datei eine Zeichenkette/Merker ersetzen.


    Bei 1. brauch ich das auf einer Variable weil ich diese noch anderweitig verarbeite....


    Backgound:
    Mein Kollege nimmt eine CSV Datei auseinander (in der Stehen dann als Ergebnis Zeilenweise die Parameter, und ich muss diese Parameter einlesen (ich weiss in welcher Zeile welcher Parameter steht) und in einer Configurationsdatei ersetzen.



    Gruss Gerd

    vdr => p8b75-m lx / pentium g2020t / 8 GB Ram / zotac gt 630 / cine S2 V5.5 / 60 gb ocz ssd / 640 gb wd scorpio blue / display noritake 256x64-3900 / chenbro PC71023 gehaeuse / yavdr stable / softhddevice


    spielsystem => p8b75-m le / intel core i3 3220T / ubuntu lts 14.04 / 16 GB ram / zotac gt 630 / cine S2 V6.2 / yavdr stable pakete / softhddevice / pulseaudio+alsa


    spielwiese => Zotac Zbox ID45 / 120 GB mSATA / via Satip => Octopus Net / yavdr stable / softhddevice

    Edited once, last by gerdh ().

  • Ich würde die Datei mit

    Code
    mapfile -t < "$DATEI"


    in ein Array einlesen (Jede Zeile ein Element)
    Dann kann man wenn der Trenner bekannt ist mit IFS die Zeilen trennen. Die Werte eventuell wieder in einem Array speichern für später.

    Kanallogos: Picon.cz2VDR | Picons2VDR | MP-Logos
    Backup-Skripte:
    MV_Backup (RSync) | MV_BorgBackup (Borg)

    Skin: Skin FlatPlus

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

  • Hi !


    Soweit habe ich das verstanden.... geht das in einer schleife ?
    Ich meine jetzt z.B.
    Zeile 1 => $irgendnevariable
    Zeile 2 => $neganzanderevariable


    Gruss Gerd

    vdr => p8b75-m lx / pentium g2020t / 8 GB Ram / zotac gt 630 / cine S2 V5.5 / 60 gb ocz ssd / 640 gb wd scorpio blue / display noritake 256x64-3900 / chenbro PC71023 gehaeuse / yavdr stable / softhddevice


    spielsystem => p8b75-m le / intel core i3 3220T / ubuntu lts 14.04 / 16 GB ram / zotac gt 630 / cine S2 V6.2 / yavdr stable pakete / softhddevice / pulseaudio+alsa


    spielwiese => Zotac Zbox ID45 / 120 GB mSATA / via Satip => Octopus Net / yavdr stable / softhddevice

  • Wenn Du mapfile nimmst, dann ist jede Zeile ein Arrayelement
    MAPFILE[0] wäre die erste Zeile


    Ein Beispiel aus meinem Backupskript:

    Code
    mapfile -t < "$EXFROM"  # Ausschlussliste einlesen
    mv --force "$EXFROM" "${_EXFROM:=${EXFROM}.$RANDOM}"  # Ausschlussliste für ./
    for i in "${!MAPFILE[@]}" ; do
      [[ "${MAPFILE[i]:0:1}" != "/" ]] && echo "${MAPFILE[i]}" >> "$EXFROM"  # Beginnt nicht mit "/"
    done

    In der for-Schleife kann amn dann die Zeilen auswerten und verarbeiten...
    Das geht auch mit dem read-Beispiel, wenn immer gleich viele werte in einer Zeile sthen (wer1;wert2;wert3)

    Kanallogos: Picon.cz2VDR | Picons2VDR | MP-Logos
    Backup-Skripte:
    MV_Backup (RSync) | MV_BorgBackup (Borg)

    Skin: Skin FlatPlus

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

  • Ebenso in die passendere Kategorie verschoben ...

    HowTo: APT pinning

  • Echt ? Hat aber nix mit dem VDR zu tun....


    Oder ist das hier in dem Bereich egal ?


    Gruss Gerd

    vdr => p8b75-m lx / pentium g2020t / 8 GB Ram / zotac gt 630 / cine S2 V5.5 / 60 gb ocz ssd / 640 gb wd scorpio blue / display noritake 256x64-3900 / chenbro PC71023 gehaeuse / yavdr stable / softhddevice


    spielsystem => p8b75-m le / intel core i3 3220T / ubuntu lts 14.04 / 16 GB ram / zotac gt 630 / cine S2 V6.2 / yavdr stable pakete / softhddevice / pulseaudio+alsa


    spielwiese => Zotac Zbox ID45 / 120 GB mSATA / via Satip => Octopus Net / yavdr stable / softhddevice

  • Die Oberkategorie hier heißt "Developer" (im vdr-portal.de) und Du hast Fragen zur Entwicklung eines bash Scripts. Geht noch mehr "OnTopic" ... ?


    Regards
    fnu

    HowTo: APT pinning

  • Hallo !


    Ich mach mal hier weiter
    mapfile scheint es hier nicht zu geben :(


    Code
    ./testconvert.sh: line 5: mapfile: command not found


    also doch wieder while read :)


    Gruss Gerd

    vdr => p8b75-m lx / pentium g2020t / 8 GB Ram / zotac gt 630 / cine S2 V5.5 / 60 gb ocz ssd / 640 gb wd scorpio blue / display noritake 256x64-3900 / chenbro PC71023 gehaeuse / yavdr stable / softhddevice


    spielsystem => p8b75-m le / intel core i3 3220T / ubuntu lts 14.04 / 16 GB ram / zotac gt 630 / cine S2 V6.2 / yavdr stable pakete / softhddevice / pulseaudio+alsa


    spielwiese => Zotac Zbox ID45 / 120 GB mSATA / via Satip => Octopus Net / yavdr stable / softhddevice

  • mapfile gibt es soweit ich weiß nur in der Bash, nicht in der "einfachen" shell, d.h. bist Du sicher daß Dein script unter bash läuft? Dazu brauchst Du in der ersten Zeile das

    Bash
    #!/bin/bash

    rfu

    :vdr2 Server: vdr 2.6.1 (yavdr) im Ubuntu 20.04 docker, Client: vdr 2.4.7 auf RPi (MLD 5.5) / Kodi (LibreELEC)

  • Hi !


    also im scrip steht ja explizit drin #!/bin/bash
    und

    Code
    afs-data:~/test_xml_generate # mapfile
    bash: mapfile: command not found


    :(


    Gibts ne Moeglichkeit es auszulesen ohne mapfile (ich meine Zeilenweise oder auch ne Variable "zerpflücken" ?



    Ach ja ich hab schon 2 Stunden google hintermir...
    ich will eine Variable vergleichen ob sie in ein Muster passt
    sprich


    sie Variable sieht so aus 1234567840 und im Muster sollen an 8. und 9. Stelle 84 stehen... was danach kommt ist wurscht
    also
    123456784
    1234567849
    12345678499
    123456784999
    1234567849999
    würden in diese Muster passen
    aber

    Code
    if [ "$T_NUMBER_1" == "???????84*" ]


    haut nicht hin


    Gruss Gerd

    vdr => p8b75-m lx / pentium g2020t / 8 GB Ram / zotac gt 630 / cine S2 V5.5 / 60 gb ocz ssd / 640 gb wd scorpio blue / display noritake 256x64-3900 / chenbro PC71023 gehaeuse / yavdr stable / softhddevice


    spielsystem => p8b75-m le / intel core i3 3220T / ubuntu lts 14.04 / 16 GB ram / zotac gt 630 / cine S2 V6.2 / yavdr stable pakete / softhddevice / pulseaudio+alsa


    spielwiese => Zotac Zbox ID45 / 120 GB mSATA / via Satip => Octopus Net / yavdr stable / softhddevice

  • Warum machst du das überhaupt mit der Bash, wenn du dafür so viel Zeil aufwenden musst? Sowohl das Parsen von csv-Dateien als auch Vergleiche mit regulären Ausdrücken kann man in gängigen Skriptsprachen wie Python, Perl, Ruby usw. sehr leicht umsetzen...


    Um an die Zahlen aus der Datei zu kommen, die dem Kriterium entsprechen, könnte man z.B. grep mit einem passenden PCRE-Ausdruck nutzen:

    Code
    for number in $(grep -Po "^\d{7}84\d*") test.txt; do
        echo "$number"
    done


    Wenn die tatsächliche Syntax der Daten bekannt wäre, könnte man natürlich gezielter an die Sache herangehen...

    yaVDR-Dokumentation (Ceterum censeo enchiridia esse lectitanda.)

  • Hi !


    zum ersten sind meine Kenntnisse der genannten "Sprachen" sehr begrenzt (Tendenz gegen 0 :) )
    zum anderen mache ich das "nebenbei" bei meiner arbeit. (ich programmiere SPSen (haupsaechlich wenn nicht gar ausschlieslich Siemens :) das ist quasi nur "Hobby in der Firma"
    Die CSV nimmt mein Kollege schon auseinander und macht daraus txt files....
    Da die CSV (noch) nicht komplett ist, muss man im Textfile eh manuell eingreifen


    Das mit der Frage passt schon...


    es steht an der 7 und 8. Stelle eine 84 im String was danach steht ist wurscht....



    Gruss Gerd

    vdr => p8b75-m lx / pentium g2020t / 8 GB Ram / zotac gt 630 / cine S2 V5.5 / 60 gb ocz ssd / 640 gb wd scorpio blue / display noritake 256x64-3900 / chenbro PC71023 gehaeuse / yavdr stable / softhddevice


    spielsystem => p8b75-m le / intel core i3 3220T / ubuntu lts 14.04 / 16 GB ram / zotac gt 630 / cine S2 V6.2 / yavdr stable pakete / softhddevice / pulseaudio+alsa


    spielwiese => Zotac Zbox ID45 / 120 GB mSATA / via Satip => Octopus Net / yavdr stable / softhddevice

  • Falls es mit dem grep nicht getan ist, weil du noch mehr aus der Zeile benötigst, kannst du auch mit Bash-Mitteln einen Regex-Vergleich machen - dazu nimmt man "=~" statt "==" als Vergleichsoperator - also z.B.

    Code
    while read line; do 
        if [[ "$line" =~ ^[[:digit:]]{7}84.* ]]; then 
            echo "$line"
        fi
    done < test.txt

    yaVDR-Dokumentation (Ceterum censeo enchiridia esse lectitanda.)

  • Hi !


    Ich lese mit sed die komplette Zeile aus (das nur so am Rande....


    Das aktuelle Problem ist der Vergleich einer Variable mit der regex
    da muessen 84 an 8. und 9. Stelle stehen der rest vorher und hinterher ist egal....


    Sprich es koennen vorher und nachher auch Buchstaben stehen.....


    so ich hab das jetzt mal durchlaufen lassen

    Code
    echo $T_NUMBER_1
    if [[ "$T_NUMBER_1" =~ ^[[:alnum:]]{8}84.* ]]; then
     echo its 84
    else
     echo its 99
    fi


    und das kommt dabei raus...


    Code
    310196999D52-AB
    its 99
    310198299D52-AK
    its 99
    CALTEST84XXX-AN
    its 99



    Gruss Gerd

    vdr => p8b75-m lx / pentium g2020t / 8 GB Ram / zotac gt 630 / cine S2 V5.5 / 60 gb ocz ssd / 640 gb wd scorpio blue / display noritake 256x64-3900 / chenbro PC71023 gehaeuse / yavdr stable / softhddevice


    spielsystem => p8b75-m le / intel core i3 3220T / ubuntu lts 14.04 / 16 GB ram / zotac gt 630 / cine S2 V6.2 / yavdr stable pakete / softhddevice / pulseaudio+alsa


    spielwiese => Zotac Zbox ID45 / 120 GB mSATA / via Satip => Octopus Net / yavdr stable / softhddevice

    Edited 2 times, last by gerdh ().

  • da muessen 84 an 8. und 9. Stelle stehen der rest vorher und hinterher ist egal....


    Code
    if [[ "$T_NUMBER_1" =~ ^[[:alnum:]]{8}84.* ]]; then


    Dann solltest du nur 7 alphanumerische Zeichen am Anfang erwarten, wenn die 8 an der achten Stelle erwartet wird:

    Code
    if [[ "$T_NUMBER_1" =~ ^[[:alnum:]]{7}84.* ]]; then

    yaVDR-Dokumentation (Ceterum censeo enchiridia esse lectitanda.)

  • Oder


    Code
    if [ ${T_NUMBER_1:7:2} == 84 ] ; then
     echo its 84
    else
     echo its 99
    fi


    vdr-User-# 755 to_h264 chk_r vdr-transcode github

Participate now!

Don’t have an account yet? Register yourself now and be a part of our community!