[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

    The post was edited 1 time, last by gerdh ().

  • Ich würde die Datei mit

    Code
    1. 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.

    Mit Freiheitsstrafe bis zu fünf Jahren oder mit Geldstrafe wird bestraft, wer eine nukleare Explosion verursacht. [StGB §328 Abs.: 2 Nr.: 3]

    ___

    Gen2VDR V7; VDR 2.4.0; Gehäuse: Antec Fusion V2 Black & iMon LCD (15c2:ffdc); Atric IR-Einschalter Rev. 4; Board: Intel DH77EB, Core i5-3550, Zotac GT630 Zone Edition, 4 GB RAM; DVB: 1x Digital Devices CineS2 Quad V6.5 [VDR-User #1540]

  • 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
    1. mapfile -t < "$EXFROM" # Ausschlussliste einlesen
    2. mv --force "$EXFROM" "${_EXFROM:=${EXFROM}.$RANDOM}" # Ausschlussliste für ./
    3. for i in "${!MAPFILE[@]}" ; do
    4. [[ "${MAPFILE[i]:0:1}" != "/" ]] && echo "${MAPFILE[i]}" >> "$EXFROM" # Beginnt nicht mit "/"
    5. 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)

    Mit Freiheitsstrafe bis zu fünf Jahren oder mit Geldstrafe wird bestraft, wer eine nukleare Explosion verursacht. [StGB §328 Abs.: 2 Nr.: 3]

    ___

    Gen2VDR V7; VDR 2.4.0; Gehäuse: Antec Fusion V2 Black & iMon LCD (15c2:ffdc); Atric IR-Einschalter Rev. 4; Board: Intel DH77EB, Core i5-3550, Zotac GT630 Zone Edition, 4 GB RAM; DVB: 1x Digital Devices CineS2 Quad V6.5 [VDR-User #1540]

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

    Shell-Script
    1. #!/bin/bash

    rfu

  • Hi !


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

    Code
    1. afs-data:~/test_xml_generate # mapfile
    2. 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
    1. 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
    1. for number in $(grep -Po "^\d{7}84\d*") test.txt; do
    2. echo "$number"
    3. 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
    1. while read line; do
    2. if [[ "$line" =~ ^[[:digit:]]{7}84.* ]]; then
    3. echo "$line"
    4. fi
    5. 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
    1. echo $T_NUMBER_1
    2. if [[ "$T_NUMBER_1" =~ ^[[:alnum:]]{8}84.* ]]; then
    3. echo its 84
    4. else
    5. echo its 99
    6. fi


    und das kommt dabei raus...


    Code
    1. 310196999D52-AB
    2. its 99
    3. 310198299D52-AK
    4. its 99
    5. CALTEST84XXX-AN
    6. 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

    The post was edited 2 times, last by gerdh ().

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


    Code
    1. 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
    1. if [[ "$T_NUMBER_1" =~ ^[[:alnum:]]{7}84.* ]]; then

    yaVDR-Dokumentation (Ceterum censeo enchiridia esse lectitanda.)

  • Oder


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


    vdr-User-# 755 to_h264 chk_r