terça-feira, 21 de novembro de 2006

Substituição de String em Vários Arquivos

Você já precisou alguma vez substituir uma string por outra em diversos arquivos ao mesmo tempo? Caso utilize Linux, uma forma de fazer isso é utilizando os comandos find e sed em conjunto.

Por exemplo, para trocar a string xyz pela string abc em todos os arquivos com a extensão txt neste diretório e abaixo, o seguinte comando (de uma linha) pode ser utilizado:

find . -name "*.txt" -exec sh -c "cp -a {} {}.tmp; sed 's/xyz/abc/g' {}.tmp > {}; rm {}.tmp" \;

O que ocorre?
O find busca, neste diretório e abaixo, por todos os arquivos terminados em '.txt'. Para cada arquivo encontrado, chama um shell (sh) e neste: copia o arquivo para um arquivo temporário; executa, contra o arquivo temporário, o comando sed - com o parâmetro 's/xyz/abc/g', que serve para ler o arquivo e jogá-lo na saída padrão, com todas as ocorrências da string xyz substituídas por abc; direciona a saída padrão para o arquivo original; e exclui o arquivo temporário. E assim por diante, para cada arquivo que o find encontrar.

Em caso de dúvidas quanto ao find, consulte sua página de manual (man find). Quanto ao sed, por ser um comand muito abrangente e flexível, sua página de manual não é tão útil quanto algumas outras documentações encontradas na internet. Uma boa: http://aurelio.net/sed/sed-HOWTO.

Um comentário:

Anônimo disse...

O que vc quer se resolve com um simples:

sed -i 's/xyz/abc/g' *.txt

A opção "-i" do sed faz com que a substituição seja feita no próprio arquivo.
Internamente, ele cria arquivos temporários e depois substitui os originais pelos temporários, com as modificações.

É mais rápido e mais simples do que usar o script sugerido