Encontre e substitua caracteres especiais em um diretório

Encontre e substitua caracteres especiais em um diretório

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

  1. Substitua tudo ..\..\por/media/usr/part/dir/
  2. 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 sedcomando 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 gchave 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

informação relacionada