Recursivamente substitua string em arquivos

3

Eu quero substituir a barra invertida na string page_path\example_filename.txt por uma barra. Também quero poder executar isso em um sistema de arquivos grande e fazer com que ele pesquise recursivamente todos os diretórios.

Encontrei alguém na Web que disse usar grep , xargs e sed , mas não consegui fazer com que funcionasse. Eu tenho tentado diferentes variações em delimitadores e caracteres de escape, mas não entendi.

Aqui está o comando que eu estava tentando executar:
grep -lr -e 'page_path\' * | xargs sed -i 's/page_path\/page_path//g'

Obrigado antecipadamente.

    
por Anthony Elliott 21.03.2012 / 18:58

2 respostas

3

Você também pode usar o find para isso:

find /your/path -type f -exec grep -l 'page_path\' {} \; -exec sed -i 's#page_path\#page_path/#g' {} \;

O segundo exec será executado somente se o primeiro for bem-sucedido, e você não terá problemas com o unprintable ou com a necessidade de caracteres em nomes de arquivos.

    
por 21.03.2012 / 19:18
5

Com grep | xargs , você tem problemas com espaços em branco em nomes de arquivos. Você pode evitar esse problema usando: grep -lZr ... | xargs -0 sed ... , que usa zero bytes como delimitador.

E agora em relação ao comando sed: O truque é que você pode usar em vez de s/a/b/ qualquer outro caractere, por exemplo, s#a#b# :

 sed -i 's#page_path\#page_path/#g'
    
por 21.03.2012 / 19:07

Tags