Buscar y reemplazar caracteres especiales en un directorio

Buscar y reemplazar caracteres especiales en un directorio

Tengo varios basados ​​en Windows.m3ulistas de reproducción: comienzan con ..\..\y tienen \en lugar /de rutas de carpeta, mientras que Ubuntu prefiere que comiencen con /media/usr/part/dir/(es decir, la ruta absoluta).

quiero hacer los siguientes cambios

  1. Reemplace todo ..\..\con/media/usr/part/dir/
  2. Reemplace todo \con/

Intenté usar find /home/user/directory -name \*.m3u -exec sed -i "s/\.\.\\\.\.\/\/media\/usr\/part\/dir\//g" {} \;como se sugiereaquí, e intenté usar _y :como delimitadores como se sugiereaquí.

Sin embargo, sigo recibiendo

sed: -e expression #1, char 36: unterminated `s' command

¿Cómo hago los reemplazos necesarios en mis archivos?

Respuesta1

s/\.\.\\\.\.\/\/media\/usr\/part\/dir\//g

Este sedcomando es incorrecto, porque falta un elemento \antes del primero /, lo que lleva al anterior \a escaparlo como un literal /(cambiando el patrón y "comiéndose" el separador) y, con el propósito de reemplazar una única aparición de ..\..\en cada línea, tiene un ginterruptor excesivo al final; en cualquier caso falta el reemplazo de los \personajes con la /parte del personaje.

Utilice este en su lugar; Me he tomado la libertad de cambiar el separador para deshacerme de una posible aparición repentina.síndrome del palillo inclinadoy cambiar ;con +para mejorar el rendimiento del comando en una gran cantidad de archivos:

find /home/user/directory -name \*.m3u -exec sed -i 's|\.\.\\\.\.\\|/media/usr/part/dir/|; s|\\|/|g' {} \+

Producción:

~/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

información relacionada