Ich habe eine Reihe von Windows-basierten.m3uWiedergabelisten – sie beginnen mit ..\..\
und haben \
anstelle von /
für Ordnerpfade, während Ubuntu es vorzieht, dass sie mit beginnen /media/usr/part/dir/
(d. h. der absolute Pfad).
Ich möchte folgende Änderungen vornehmen
- Ersetzen Sie alle
..\..\
durch/media/usr/part/dir/
- Ersetzen Sie alle
\
durch/
Ich habe versucht, find /home/user/directory -name \*.m3u -exec sed -i "s/\.\.\\\.\.\/\/media\/usr\/part\/dir\//g" {} \;
es wie vorgeschlagen zu verwendenHierund habe wie vorgeschlagen versucht, _
und als Trennzeichen zu verwenden.:
Hier.
Ich bekomme jedoch immer wieder
sed: -e expression #1, char 36: unterminated `s' command
Wie nehme ich die notwendigen Ersetzungen in meinen Dateien vor?
Antwort1
s/\.\.\\\.\.\/\/media\/usr\/part\/dir\//g
Dieser Befehl ist falsch, weil vor dem ersten sed
ein fehlt , was dazu führt, dass das vorhergehende als Literal entgeht (wodurch das Muster geändert und das Trennzeichen „aufgefressen“ wird) und weil er zum Ersetzen eines einzelnen Vorkommens von in jeder Zeile einen überflüssigen Schalter am Ende hat ; in jedem Fall fehlt das Ersetzen der Zeichen durch den Zeichenteil.\
/
\
/
..\..\
g
\
/
Verwenden Sie stattdessen dieses; ich habe mir die Freiheit genommen, das Trennzeichen zu ändern, um ein wahrscheinlich plötzlichesschiefes Zahnstocher-Syndrom;
und mit zu ändern, +
um die Leistung des Befehls bei einer großen Anzahl von Dateien zu verbessern:
find /home/user/directory -name \*.m3u -exec sed -i 's|\.\.\\\.\.\\|/media/usr/part/dir/|; s|\\|/|g' {} \+
Ausgabe:
~/tmp$ cat playlist1.m3u
..\..\path1
stuff
..\..\path2\path2
stuff
..\..\path3\path3\path3
stuff
~/tmp$ find . -name \*.m3u -exec sed -i 's|\.\.\\\.\.\\|/media/usr/part/dir/|; s|\\|/|g' {} \+
~/tmp$ cat playlist1.m3u
/media/usr/part/dir/path1
stuff
/media/usr/part/dir/path2/path2
stuff
/media/usr/part/dir/path3/path3/path3
stuff