Encontre e substitua caracteres especiais em um diretório

1

Eu tenho várias listas de reprodução .m3u baseadas no Windows - elas começam com ..\..\ e têm \ em vez de / para caminhos de pastas, enquanto o Ubuntu prefere começar com /media/usr/part/dir/ (ou seja, o caminho absoluto).

Eu quero fazer as seguintes alterações

  1. Substitua todo o ..\..\ por /media/usr/part/dir/
  2. Substitua todo o \ por /

Eu tentei usar find /home/user/directory -name \*.m3u -exec sed -i "s/\.\.\\.\.\/\/media\/usr\/part\/dir\//g" {} \; como sugerido aqui e tentou usar _ e : como delimitadores, conforme sugerido aqui .

No entanto, continuo recebendo

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

Como faço as substituições necessárias em meus arquivos?

    
por 3l4ng 08.07.2015 / 17:03

1 resposta

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

Este comando sed está errado, porque tem um \ faltando antes do primeiro / , o que leva o \ anterior a escapar como um literal / (alterando o padrão e "comendo" o separador) e, para o propósito de substituir uma única ocorrência de ..\..\ em cada linha, ela tem uma% excessiva de g no final; em qualquer caso, falta a substituição dos caracteres \ pela parte de caracteres / .

Use este em vez disso; Tomei a liberdade de mudar o separador para me livrar de uma provável síndrome do palito inclinado e alterar ; com + 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
    
por kos 08.07.2015 / 17:24