Найти и заменить специальные символы в каталоге

Найти и заменить специальные символы в каталоге

У меня есть несколько компьютеров на базе Windows..m3uплейлисты - они начинаются с ..\..\и \вместо /путей к папкам имеют , тогда как Ubuntu предпочитает, чтобы они начинались с /media/usr/part/dir/(т. е. с абсолютного пути).

Я хочу внести следующие изменения

  1. Заменить все ..\..\на/media/usr/part/dir/
  2. Заменить все \на/

Я попробовал использовать find /home/user/directory -name \*.m3u -exec sed -i "s/\.\.\\\.\.\/\/media\/usr\/part\/dir\//g" {} \;предложенный способздесь, и попытался использовать _и :в качестве разделителей, как было предложеноздесь.

Однако я продолжаю получать

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

Как мне сделать необходимые замены в моих файлах?

решение1

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

Эта sedкоманда неверна, поскольку в ней отсутствует \перед первым /, что приводит к тому, что предшествующий оператор \экранирует его как литерал /(изменяя шаблон и «съедая» разделитель), а для замены одного вхождения ..\..\в каждой строке в ней имеется лишний gswitch в конце; в любом случае в ней отсутствует замена символов \на /символьную часть.

Используйте этот вместо этого; я взял на себя смелость изменить разделитель, чтобы избавиться от вероятной внезапнойсиндром наклонной зубочисткии изменить ;на +, чтобы улучшить производительность команды над большим количеством файлов:

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

Выход:

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

Связанный контент