Anzeige:
Ergebnis 1 bis 8 von 8

Thema: kleines problem mit grep...

  1. #1
    Registrierter Benutzer
    Registriert seit
    30.04.2001
    Beiträge
    89

    kleines problem mit grep...

    hallo leute...

    das backslash macht mir probleme... ich hab hier einen haufen m3u-listen (unter win erstellt). die pfade sind leider durch \ getrennnt... das wollte ich mal in ein / ändern lassen...

    grep "\" *

    bringt leider nicht den gewünschten erfolg... ich hab auch diverse andere schreibweisen ausprobiert...

    hat jemand ne idee?

  2. #2
    Registrierter Benutzer Avatar von phate
    Registriert seit
    14.02.2003
    Beiträge
    149
    Hi jean_luc_picard,

    mit grep bist Du auf dem Holzweg. grep dient zur Filterung von Texten anhand von Suchausdrücken und nicht zur Umwandlung.

    Das Umwandeln der Seperatoren kannst Du mit
    Code:
    sed -e 's/\\/\//g' datei.m3u
    oder
    Code:
    tr '\\' '/' < datei.m3u
    bewerkstelligen. Die Ausgabe kannste dann in eine neue Datei umlenken. Um was Du Dich dann aber noch kümmern musst ist die Umwandlung der Laufwerksbuchstaben in den entsprechenden Mountpoints unter Linux.

  3. #3
    Registrierter Benutzer
    Registriert seit
    26.12.2002
    Ort
    Matrix
    Beiträge
    194
    Original geschrieben von phate
    Die Ausgabe kannste dann in eine neue Datei umlenken.
    wenn man das nicht will, kann man auch perl's in-place editing verwenden:

    perl -pi -e 's/\\/\//g' m3u-liste

    -j

  4. #4
    Registrierter Benutzer
    Registriert seit
    30.04.2001
    Beiträge
    89
    danke für die hinweise

    nun brauche ich aber grep doch noch für ne andere funktion in dem skript...
    Code:
    grep ".m3u"
    um alle m3u listen in dem verzeichnis zu erfassen... leider steht ja auch der punkt

    . (grep, egrep)
    Genau ein beliebiges Zeichen
    (aus der linuxfibel )

    nun hatte ich (ebenfalls aus der linuxfibel) angenommen, das es mit
    Code:
    grep "[:punct:]m3u"
    geht, klappt aber leider auch nicht...

  5. #5
    Registrierter Benutzer Avatar von phate
    Registriert seit
    14.02.2003
    Beiträge
    149
    Du musst den Punkt escapen
    Code:
    grep "\.m3u"
    So wird er nicht als Metazeichen sondern als Punkt interpretiert.

    Poste mal Dein Skript wenns fertig ist. Evtl. können wir da noch was dran basteln und Du dadurch was lernen.

  6. #6
    Registrierter Benutzer
    Registriert seit
    30.04.2001
    Beiträge
    89
    hatte ich vor...
    ich bin halt noch relativ unbelesen im skripten ... danke schomal

  7. #7
    Registrierter Benutzer
    Registriert seit
    30.04.2001
    Beiträge
    89
    hat jetzt zwar nichts mehr mit grep zu tun, aber mit dem skript, was ich schreiben wollte...
    hier erstmal das ich bisher habe:

    Code:
    #!/bin/bash
    #script zum konvertieren von m3u-playlisten, windows-verzeichnistrenner "\" werden in "/" umgewandelt.
    #aufruf: m3u2linux absoluter_pfad_mit_playlisten
    #funtioniert nur bei relativen pfadangaben, welche mit ./ oder ../ beginnen
    #temporäre dateien
    todo=/tmp/m3u2linux.todo
    convert=/tmp/m3u2linux.convert
    
    
    #prüfen, ob der angegebene pfad existiert
      if [ -d "$1" ]; then
        #alle m3u listen in dem angegebenen verzeichnis erfassen und zwischenspeichern
        #leerzeichen durch \leerzeichen ersetzen
        ls $1 | grep \.m3u | sed -e 's/\ /\\\ /g' > $todo
    
        for line in $(cat $todo); do
          echo "konvertiere $1$line"
          sed -e 's/\\/\//g' $1$line > $convert
          #prüfen, ob rückgabewert ok ist (ob erfolgreich)
          if [ "$?" = "0" ]; then
            #datei zurückkopieren
            mv $convert $1$line
          else
            echo "Fehler bei $1$line"
            exit 1
          fi
        done  
      fi
    exit 0
    das problem ist, das beim aufruf der schleife in $line nicht die zeilen der datei gespeichert werden, sondern die wörter (durch leerzeichen getrennt)... obwohl beim aufruf von cat doch immer zeilen ausgegeben werden...

    wie würdet ihr das lösen?

  8. #8
    Registrierter Benutzer
    Registriert seit
    30.04.2001
    Beiträge
    89

    FERTIG!

    hab das skript jetzt fertig... musste mich zwar ungewöhnlicher mittel bedienen aber es funktioniert...

    Code:
    #!/bin/bash
    #skript zum konvertieren von playlisten
    #alle \ werden in / umgewandelt
    todo=/tmp/flc.todo
    convert=/tmp/flc.convert
    
    #alle m3u listen in dem angegebenen verzeichnis erfassen und zwischenspeichern
    #leerzeichen im dateinamen werden in : umgewandelt
    ls $1*.m3u | sed -e 's/\ /\:/g' > $todo
    
    #abzuarbeitende dateien aus todo-liste holen
    for line in $(cat $todo); do
      #dateinamen ins ursprüngliche format bringen (: zu leerzeichen)
      #und in variable speichern
      now=$(echo $line | sed -e 's/\:/\ /g')
      echo "konvertiere jetzt $1$now"
      #datei an sed zur bearbeitung übergeben, ausgabe in temporäre datei umleiten
      sed -e 's/\\/\//g' "$1$now" > $convert
      #prüfen, ob rückgabewert ok ist (ob erfolgreich)
      if [ "$?" = "0" ]; then
        #datei zurückkopieren
        echo ok
        mv $convert "$now"
      else
        echo "Fehler bei $now"
        exit 1
      fi
    done
    
    #temporäre dateien entfernen
    rm $todo
    exit 0
    evtl. wäre es noch sinnvoll, die windows-zeilenumbrüche zu entfernen/ersetzen...?
    der pfad zu den playlisten muss hinten mit / enden...
    kennt jemand vielleicht ne mit angemessenem aufwand zu realisierende lösung, um das skript rekursiv arbeiten zu lassen (so wie bei chmod 0700 /pfad -R)?

    leider musste ich auch feststellen, das der windows-mediaplayer die listen nicht mehr lesen kann... winamp hingegen schon (stört mich aber nicht )
    Geändert von jean_luc_picard (27-03-2003 um 09:22 Uhr)

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •