PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : kleines problem mit grep...



jean_luc_picard
24-03-2003, 06:20
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?

phate
24-03-2003, 09:14
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
sed -e 's/\\/\//g' datei.m3u
oder

tr '\\' '/' < datei.m3ubewerkstelligen. 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.

Jasper
24-03-2003, 09:22
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

jean_luc_picard
24-03-2003, 18:24
danke für die hinweise :)

nun brauche ich aber grep doch noch für ne andere funktion in dem skript...


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


grep "[:punct:]m3u"

geht, klappt aber leider auch nicht... :(

phate
24-03-2003, 18:46
Du musst den Punkt escapen
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.

jean_luc_picard
24-03-2003, 19:16
hatte ich vor...
ich bin halt noch relativ unbelesen im skripten ;) ... danke schomal

jean_luc_picard
26-03-2003, 09:22
hat jetzt zwar nichts mehr mit grep zu tun, aber mit dem skript, was ich schreiben wollte...
hier erstmal das ich bisher habe:



#!/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?

jean_luc_picard
27-03-2003, 09:43
hab das skript jetzt fertig... musste mich zwar ungewöhnlicher mittel bedienen ;) aber es funktioniert...



#!/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 ;))