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

У меня есть много 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
задан 13 April 2017 в 15:23

1 ответ

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

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

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

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
2
ответ дан 7 December 2019 в 13:56

Другие вопросы по тегам:

Похожие вопросы: