[gelöst] Problem mit grep (Erstlingswerk)

  • Hallöchen,


    benötige etwas hilfe mit meinem Erstlingswerk, einem bash-Script, daß automatisch Aufnahmen von Radio-Hörspielen nach Aufnahmeende in MP3 umwandeln soll inclusive tagging. Das ganze Script ist hier zu finden:


    vdr2mp3.sh


    Mir gehts um die letzte der beiden nachfolgenden Zeilen:


    Code
    KOMMENTAR=`grep "^D" $INFODATEI | sed -e 's/\n//g' -e 's/\r//g' | cut -d " " -f2-300`
    #JAHR=`grep " [1-2][09][0-9][0-9]" $KOMMENTAR`


    Diese Zeile soll mir ein eventuell angegebenes Aufnahmejahr liefern. Vielleicht kann man das auch eleganter machen? Jedenfalls bleibt das Script hier stehen, wenn der Kommentar leer ist oder keine Jahresangabe enthält (deswegen auskommentiert). Wie kann ich das ändern bzw. was mache ich falsch?


    Für jedwede andere Hilfe zu dem gesamten Script bin ich ebenfalls dankbar. Das mit den verschiedenen Hochkommatas, Anführungszeichen, backslash, eckige Klammer, pipes usw usf ist schon ziemlich verwirrend...

    vdr 1.7.x auf/von Debian Wheezy mit Kernel 3.14.6, Alix.1c Board mit AMD Geode 500 MHz, PCTV 461e, Steuerung über Live-Plugin
    vdr 2.2.0 auf Raspbian GNU/Linux 7.6 mit Kernel 3.18.5+, Raspi B+, PCTV 461e, Plugins: dynamite, epgsearch, live

    3 Mal editiert, zuletzt von xheinrich ()

  • Wenn $KOMMENTAR leer ist, bleibt grep stehen, weil es STDIN liest.


    also besser vorher testen, ob der Kommentar leer ist:
    [ -z "$KOMMENTAR" ] && JAHR=`grep " [1-2][09][0-9][0-9]" $KOMMENTAR`


    Wenn kein Jahr gefunden wird, sollte JAHR einfach leer bleiben und nicht stehenbleiben.
    Leider lässt sich bei grep das nicht so elegant wie unter Perl formulieren und Du brauchst tatsächlich die vier Stellen. Ob Du allerdings wirklich noch nach "19" suchen willst?


    uwe

    server: yavdr trusty testing, 2 * L5420, 32GB, 64TB RAID6 an OctopusNet (DVBS2- 8 ) + minisatip@dsi400 (DVBS2- 4 )
    frontends: kodi und xine

  • Zitat

    Original von umaier
    Wenn $KOMMENTAR leer ist, bleibt grep stehen, weil es STDIN liest.


    grep sollte auch eine Fehlermeldung leifern, wenn $KOMMENTAR etwas enthaelt: "No such file or directory"


    Ihr seid beide dem Irrtum aufgesessen, dass grep etwas aus Strings filtert. Ist aber nicht so. grep liest Dateien. Und wenn keine Datei angegeben ist, liest grep stdin. Wartet also bei leerem $KOMMENTAR auf Eingabe.


    xheinrich:
    Auf den Beitrag kann man mit dem kleinen weissen Symbol verlinken, was links unter dem NAmen des Posters zu finden ist (neben den Post Datum).


    Weiterhin:
    Wenn Du aus $KOMMENTAR das Jahr suchen willst, mache das so:

    Code
    echo "$KOMMENTAR" | grep " [1-2][09][0-9][0-9]"


    Ob das allerdings funktioniert, haeng davon ab, wie $KOMMENTAR aussieht. Beachte, das grep nicht einen einzelnen String ausfiltert, sondern immer die ganze Zeile anzeigt, die den String enthaelt.


    Gib' mal ein Beispiel fuer den Inhalt von $KOMMENTAR und $INFODATEI, dann sehen wir mal weiter...

    Glotze: yaVDR (ASRock Q1900M, 4GB RAM, DD Cine S2 V6.5, ZOTAC GT630 (Rev. 2)
    Server: HP ProLiant MicroServer G8, VMware ESXi 5.5 :P

    Einmal editiert, zuletzt von knebb ()

  • Zitat

    Ihr seid beide dem Irrtum aufgesessen, dass grep etwas aus Strings filtert. Ist aber nicht so. grep liest Dateien. Und wenn keine Datei angegeben ist, liest grep stdin. Wartet also bei leerem $KOMMENTAR auf Eingabe.


    Tsts, da habe ich doch glatt die Bedeutung von $KOMMENTAR übersehen.


    grep versucht $KOMMENTAR als Datei zu interpretieren. Ist die Variable leer, ist es wie wenn kein Parameter angegeben wurde. Dann wird von STDIN gelesen. Gibt's die Datei nicht, liefert grep einen Fehler, macht aber weiter.


    Die Jahreszahl würde ich dann mit sed extrahieren:

    Zitat

    JAHR=`echo $KOMMENTAR | grep [12][90][0-9][0-9] | sed -e 's/.*\([12][90][0-9][0-9]\).*/\1/'`


    Enthält KOMMENTAR kein Jahr, ist JAHR leer, sonst enthält es das Jahr. Grep sorgt für die "Leere".


    uwe

    server: yavdr trusty testing, 2 * L5420, 32GB, 64TB RAID6 an OctopusNet (DVBS2- 8 ) + minisatip@dsi400 (DVBS2- 4 )
    frontends: kodi und xine

    Einmal editiert, zuletzt von umaier ()

  • Erst einmal vielen Dank für die aufschlußreichen Antworten!


    Hier einmal der Inhalt eines $KOMMENTAR


    Code
    Übersetzung aus dem Amerikanischen: Marcus Ingendaay|Deb: Nicole Heesters|Manny: Rudolf Kowalski|Frank: Florian Lukas|Tommy: Wanja Mues|Amy: Anja Herden|Stuart: Matthias Leja|Colleen: Nina Weniger|Regie: Thomas Werner WDR 2003


    Ein Beispiel für eine Info-Datei habe ich gerade nicht zur Hand (alle Aufnahmen konvertiert ;) Der Kommentar wird einfach aus der Info-Datei im Aufnahmeverzeichnis extrahiert, d.h. alles in der Zeile, die mit "D " anfängt, soweit es die Zeile überhaupt gibt oder diese außer D Leerz. noch Daten enthält (manche Sender sind sehr schlampig).
    D.h. es gibt folgende Möglichkeiten:
    - $KOMMENTAR ist leer
    - $KOMMENTAR enthält Zeichen aber keine Jahreszahl
    - $KOMMENTAR enthält Jahreszahl und evtl. andere Zeichen.


    umaier:
    Mögliche Jahreszahlen beginnen so bei 1930. Ältere Hörspiele gibts es glaube ich nicht. (Gemeint ist nicht das Datum meiner Aufnahme.)
    knebb:
    Werde den Link in meiner Frage ändern, danke für den Tip!
    umaier:
    Werde Dein letztes Beispiel mal ausprobieren. Nächste Aufnahme ist heute Abend um 20:00, dann weiß ich mehr :]

    vdr 1.7.x auf/von Debian Wheezy mit Kernel 3.14.6, Alix.1c Board mit AMD Geode 500 MHz, PCTV 461e, Steuerung über Live-Plugin
    vdr 2.2.0 auf Raspbian GNU/Linux 7.6 mit Kernel 3.18.5+, Raspi B+, PCTV 461e, Plugins: dynamite, epgsearch, live

  • So, der erste Test ist durch mit einem Kommentar, in dem stand, wann die nächsten Nachrichten und der Wetterbericht kommt (so ein Schmarrn!). Das Script lief unbeeindruckt durch!!


    [Edit] Bei einem 'richtigen' Kommentar wurde die Jahreszahl herausgefiltert und entsprechend getagged.


    Vielen Dank an alle! :tup
    Werde den Thread auf gelöst setzen. Tolles Portal hier!


    :grinzs

    vdr 1.7.x auf/von Debian Wheezy mit Kernel 3.14.6, Alix.1c Board mit AMD Geode 500 MHz, PCTV 461e, Steuerung über Live-Plugin
    vdr 2.2.0 auf Raspbian GNU/Linux 7.6 mit Kernel 3.18.5+, Raspi B+, PCTV 461e, Plugins: dynamite, epgsearch, live

    Einmal editiert, zuletzt von xheinrich ()

  • Zitat

    Originally posted by umaier
    JAHR=`echo $KOMMENTAR | grep [12][90][0-9][0-9] | sed -e 's/.*\([12][90][0-9][0-9]\).*/\1/'`


    Ich mach mal ab hier weiter. Grep ist schon mal überflüssig:


    JAHR=`echo "$KOMMENTAR" | sed -ne 's/.*\([12][90][0-9][0-9]\).*/\1/p'`


    Beide Lösungen haben übrigens noch Schönheitsfehler, falls KOMMENTAR über mehrere Textzeilen geht, vorausgesetzt, das kann überhaupt passieren.



    Eigentlich ist aber auch sed überflüssig, die Bash kann das alles auch alleine:


    HEAD="${KOMMENTAR%[12][90][0-9][0-9]*}"
    if [ "$HEAD" != "$KOMMENTAR" ] ; then JAHR="${KOMMENTAR:${#HEAD}:4}" ; fi



    Gruß,


    Udo

  • @ Urig:
    Sieht so aus, als seist Du Spezialist! Vielen Dank, Deine Lösung funktioniert.


    Jetzt habe ich noch ein Problem mit dem KOMMENTAR, folgendes:
    Manchmal enthält der Kommetar Anführungszeichen, die stören, wenn ich den Kommtar als ID-Tag verwenden möchte. Lame bricht mit einer Fehlermeldung ab. Wie kann ich die Anführungszeichen am Besten ersetzen, z.B. mit <> oder noch besser «», das müßte lame eigentlich können.


    Außerdem möchte ich natürlich auch überlange Kommentare kürzen können, z.B. auf 256 bytes, weil solch lange Texte meistens auf eine allg. Senderinfo hindeuten, die mit der Sendung garnichts zu tun haben, mithin also wertlos sind (in meinem Kontext)

    vdr 1.7.x auf/von Debian Wheezy mit Kernel 3.14.6, Alix.1c Board mit AMD Geode 500 MHz, PCTV 461e, Steuerung über Live-Plugin
    vdr 2.2.0 auf Raspbian GNU/Linux 7.6 mit Kernel 3.18.5+, Raspi B+, PCTV 461e, Plugins: dynamite, epgsearch, live

  • Zitat

    Originally posted by xheinrich
    Manchmal enthält der Kommetar Anführungszeichen, die stören, wenn ich den Kommtar als ID-Tag verwenden möchte. Lame bricht mit einer Fehlermeldung ab. Wie kann ich die Anführungszeichen am Besten ersetzen, z.B. mit <> oder noch besser «», das müßte lame eigentlich können.


    #> test='ein "einfacher" Test'
    #> test="${test//\"/^}"
    #> echo "$test"
    ein ^einfacher^ Test


    Das Ersetzen gegen ein einfaches Zeichen, hier ^, funktioniert so gut. Eigentlich hätte ich gerne gegen ' ersetzt, aber da verhakt sich die Bash in ihrem eigenen Quoting-Dschungel, "${test//\"/'}" fehlt angeblich ein schließendes ' , "${test//\"/\'}" ersetzt dagegen tatsächlich mit \' ...
    Vorschläge sind willkommen.


    Zitat

    Außerdem möchte ich natürlich auch überlange Kommentare kürzen können, z.B. auf 256 bytes, weil solch lange Texte meistens auf eine allg. Senderinfo hindeuten, die mit der Sendung garnichts zu tun haben, mithin also wertlos sind (in meinem Kontext)


    #> test='12345678901234567890'
    #> echo "${test:0:10}"
    1234567890


    Gruß,


    Udo

  • Urig: Also erst nochmal herzlichen Dank für Deine Unterstützung!


    Die Ersetzung von Anführungszeichen mit einem anderen, in Deinem Beispiel mit ^ (gute Idee) habe ich beim herauslösen des Kommentars mit einem weiteren Kriterium für sed (das letzte) angegeben:

    Code
    KOMMENTAR=`grep "^D" $INFODATEI | sed -e 's/\n//g' -e 's/\r//g' -e 's/"/^/g' | cut -d " " -f2-300`


    Müßte so auch gehen, oder? (Hab's noch nicht ausprobiert). Was ich mir gewünscht hätte, wäre eine Ersetzung durch franz. Anführungszeichen, die am Anfang und Ende aber leider nicht gleich sind. Wahrscheinlich ist das einfach zu schwierig für ein Script...


    Die Längenbeschränkung habe ich mal übernommen, werde heute Abend testen...


    Vielen Dank nochmal!
    Gruß


    Heinrich

    vdr 1.7.x auf/von Debian Wheezy mit Kernel 3.14.6, Alix.1c Board mit AMD Geode 500 MHz, PCTV 461e, Steuerung über Live-Plugin
    vdr 2.2.0 auf Raspbian GNU/Linux 7.6 mit Kernel 3.18.5+, Raspi B+, PCTV 461e, Plugins: dynamite, epgsearch, live

    Einmal editiert, zuletzt von xheinrich ()

  • Zitat

    Originally posted by xheinrich
    Was ich mir gewünscht hätte, wäre eine Ersetzung durch franz. Anführungszeichen, die am Anfang und Ende aber leider nicht gleich sind. Wahrscheinlich ist das einfach zu schwierig für ein Script...


    Dazu müsste man zwischen Anfangs-Anführungszeichen und End-Anführungszeichen unterscheiden, das wird knifflig und fehleranfällig.


    ... Er sage: "Mein 40" Plasma ist "etwas" schwerer als mein 21" Flachbildschirm". Ok, der ist fies. ;)



    Gruß,


    Udo


    PS: echo 'Dies "ist" ein "Test"' | sed -e 's/"\([^"]*\)"/<<\1>>/g' -e 's/"/^/'

  • Also geht es doch! Vielen Dank an Dich, Urig. Leider hab ich die Zeile nicht verstanden, aber es funktioniert - und das ist schließlich das wichtigste!


    Bei dem Beispiel von Dir kommt man wahrscheinlich nur mit lexikalischer und Syntaxanalyse weiter - ein C-Programm dafür zu schreiben wäre dann etwas viel Aufwand, da ich nciht glaube, daß so etwas oft vorkommt. Obwohl das nicht völlig ausgeschlossen ist, da bei Hörspielen manchmal eine Text-Kurzfassung mitgesendet wird.

    vdr 1.7.x auf/von Debian Wheezy mit Kernel 3.14.6, Alix.1c Board mit AMD Geode 500 MHz, PCTV 461e, Steuerung über Live-Plugin
    vdr 2.2.0 auf Raspbian GNU/Linux 7.6 mit Kernel 3.18.5+, Raspi B+, PCTV 461e, Plugins: dynamite, epgsearch, live

Jetzt mitmachen!

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