você está aqui: Home  → Arquivo de Mensagens

Substituindo texto em diversos arquivos ao mesmo tempo

Colaboração: Rodrigo Fonseca

Data de Publicação: 19 de Maio de 2004

Uma das coisas mais interessantes do Linux é poder usar a saída de um programa para a entrada de outro. Esta dica mostra como substituir determinado texto em todas as ocorrências nos arquivos especificados ainda mantendo um backup de segurança dos mesmos usando find, xargs e nosso amigo Perl. :)

Vamos dissecar o comando:

  find ./ -name '*.php' | xargs perl -i.bkp -p -e 's/isso/aquilo/ig;'

find ./ -name '*.php' : vai procurar por todos os arquivos .php do diretório corrente. O find é recursivo por padrão, ou seja, ele vai procurar os arquivos .php em todos os subdiretórios do diretório atual. Se você não quiser alterar nada nos subdiretórios inclua a diretiva "-maxdepth 1" para forçar o find a trabalhar apenas no primeiro nível de diretórios, ficando:

  find ./ -maxdepth 1 -name '*.php' | xargs perl -i.bkp -p -e 's/isso/aquilo/ig;'

O comando xargs apenas recebe o input do comando find (neste caso, os nomes dos arquivos) e manda para o Perl, que vai então:

  -i.bkp : criar uma cópia do arquivo com a extensão bkp ou qualquer outra
  que você escolher.
  
  -p : executar a leitura dos arquivos em loop, linha a linha.
  
  -e : (e)xecutar o comando 's/isso/aquilo/ig' que significa substituir
  a palavra "isso" pela palavra "aquilo", em cada linha dos arquivos.

Os últimos caracatecres (ig) dizem ao Perl para (i)gnorar maiúsculas e minúsculas e fazer as alterações (g)lobalmente, caso sejam encontradas mais de uma ocorrência da palavra procurada na mesma linha. Se o "g" for omitido, o Perl somente substituirá a primeira ocorrência da palavra por cada linha.

O texto de substituição pode ser uma string literal ou uma expressão regular das mais simples ou complexas, tudo depende de você, da sua experiência e da complexidade do que quiser fazer.

Um bom exemplo de utilização é se você tiver um grande website com diversas páginas que utilizem um include para um ou mais arquivos que por ventura podem ter sua localização modificada. Exemplo:

Todos (ou uma grande maioria dos) os arquivos .php possuem um include do arquivo:

  /var/www/htdocs/seudiretorio/scripts.php

De uma hora para outra, seu hosting decide mudar este caminho para: /var/www/localhost/seudiretorio/scripts.php

Ao invés de editar arquivo por arquivo, execute:

  find ./ -name '*.php' | xargs perl -i.bkp -p -e 
  's/(\/var\/www\/)\w+(\/seudiretorio\/)/$1localhost$2/ig;'

Se algo der errado na sua expressão regular:

  rm *.php
  rename .php.bkp .php *.php.bkp


Veja a relação completa dos artigos de Rodrigo Fonseca

 

 

Opinião dos Leitores

Seja o primeiro a comentar este artigo
*Nome:
Email:
Me notifique sobre novos comentários nessa página
Oculte meu email
*Texto:
 
  Para publicar seu comentário, digite o código contido na imagem acima
 


Powered by Scriptsmill Comments Script