У меня есть несколько компьютеров на базе Windows..m3uплейлисты - они начинаются с ..\..\
и \
вместо /
путей к папкам имеют , тогда как Ubuntu предпочитает, чтобы они начинались с /media/usr/part/dir/
(т. е. с абсолютного пути).
Я хочу внести следующие изменения
- Заменить все
..\..\
на/media/usr/part/dir/
- Заменить все
\
на/
Я попробовал использовать 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
команда неверна, поскольку в ней отсутствует \
перед первым /
, что приводит к тому, что предшествующий оператор \
экранирует его как литерал /
(изменяя шаблон и «съедая» разделитель), а для замены одного вхождения ..\..\
в каждой строке в ней имеется лишний g
switch в конце; в любом случае в ней отсутствует замена символов \
на /
символьную часть.
Используйте этот вместо этого; я взял на себя смелость изменить разделитель, чтобы избавиться от вероятной внезапнойсиндром наклонной зубочисткии изменить ;
на +
, чтобы улучшить производительность команды над большим количеством файлов:
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