
Eu tenho vários sistemas baseados em Windows.m3uplaylists - elas começam com ..\..\
e têm caminhos de pasta \
em vez de /
for, enquanto o Ubuntu prefere que comecem com /media/usr/part/dir/
(ou seja, o caminho absoluto).
Quero fazer as seguintes alterações
- Substitua tudo
..\..\
por/media/usr/part/dir/
- Substitua tudo
\
por/
Eu tentei usar find /home/user/directory -name \*.m3u -exec sed -i "s/\.\.\\\.\.\/\/media\/usr\/part\/dir\//g" {} \;
como sugeridoaquie tentei usar _
e :
como delimitadores conforme sugeridoaqui.
No entanto, continuo recebendo
sed: -e expression #1, char 36: unterminated `s' command
Como faço as substituições necessárias em meus arquivos?
Responder1
s/\.\.\\\.\.\/\/media\/usr\/part\/dir\//g
Este sed
comando está errado, pois possui uma falta \
antes do first /
, o que leva o anterior \
a escapá-lo como literal /
(alterando o padrão e "comendo" o separador) e, com o propósito de substituir uma única ocorrência de ..\..\
em cada linha, tem uma g
chave excessiva no final; em qualquer caso, falta a substituição dos \
personagens pela /
parte do personagem.
Use este em vez disso; Tomei a liberdade de trocar o separador para me livrar de um provável problema repentinosíndrome do palito inclinadoe mudar ;
para +
melhorar o desempenho do comando em um grande número de arquivos:
find /home/user/directory -name \*.m3u -exec sed -i 's|\.\.\\\.\.\\|/media/usr/part/dir/|; s|\\|/|g' {} \+
Saída:
~/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