Como apagar palavras em varios arquivos diferentes com o sed? [RESOLVIDO]

1. Como apagar palavras em varios arquivos diferentes com o sed? [RESOLVIDO]

Rick
rick_G

(usa Debian)

Enviado em 05/01/2015 - 13:15h

Pessoal estou com uma dúvida, estou tentando fazer um script para encontrar uma determinada entrada em vários arquivos e depois apagar essas entradas. Sei que se executar: grep -Ri "entrada" /var/www/* vou saber os arquivos que contém essa entrada, mas como faço para apagar essas entradas? Sei o Sed faz isso mas não sei utiliza-lo :(
Poderiam me ajudar?


  


2. MELHOR RESPOSTA

Perfil removido
removido

(usa Nenhuma)

Enviado em 05/01/2015 - 16:30h

Ricardo_Galossi escreveu:


fiz um teste simples e funcionou perfeitamente, mas quando coloco a entrada que preciso apagar da um erro, a entrada seria essa: @require(dirname(__FILE__).'/path/file.php'), dai quando dou o comando sed -i '-s/@require(dirname(__FILE__).'/path/file.php')//gi' /var/www/* da o seguinte erro: sed: -e expression #1, char 36: unknown option to `s'
to fazendo algo errado?


Sim, há erros aí. O primeiro é o hífen precedendo o comando "s" do sed. Além disto, o seu comando está tentando substituir @require(dirname(__FILE__). por path, usando flags desconhecidas, a letra "f" é a primeira. O sed pára a execução no primeiro erro encontrado e ignora o resto.

Você pode corrigir isto de duas formas:

sed -i 's|@require(dirname(__FILE__).'\''/path/file.php'\'')||gi' /var/www/* 


ou

sed -i 's|@require(dirname(__FILE__).\x27/path/file.php\x27)||gi' /var/www/* 


Modifiquei os delimitadores do comando "s" para facilitar a leitura, mas poderia ter escapado as barras do nome de arquivo também.

É necessário inibir as expansões do shell já que a sua string contém apóstrofos e a parte entre elas seria expandida pelo shell e, sem dúvidas, ou o comando não funcionaria ou teria feito substituições estranhas nos seus arquivos. Se fosse um script em sed, este recho não seria necessário. Esta parte é conhecimento básico em shell, não chega a ser "sed" ainda.



3. Re: Como apagar palavras em varios arquivos diferentes com o sed? [RESOLVIDO]

staimeer
staimeer

(usa Slackware)

Enviado em 05/01/2015 - 15:12h

Amigo, fiz assim e funcionou
sed -i 's/nome//g' arquivo*


4. Re: Como apagar palavras em varios arquivos diferentes com o sed? [RESOLVIDO]

Perfil removido
removido

(usa Nenhuma)

Enviado em 05/01/2015 - 15:19h

Ricardo_Galossi escreveu:

Pessoal estou com uma dúvida, estou tentando fazer um script para encontrar uma determinada entrada em vários arquivos e depois apagar essas entradas. Sei que se executar: grep -Ri "entrada" /var/www/* vou saber os arquivos que contém essa entrada, mas como faço para apagar essas entradas? Sei o Sed faz isso mas não sei utiliza-lo :(
Poderiam me ajudar?


Obs.: Antes de fazer qualquer teste, certifique que seu backup está em dia.

Se o comando
grep 
acima mostra exatamente o que você deseja. Podemos usá-lo como referência para criar um sed inline:

sed -i 's/entrada//gi' /var/www/* 


removendo todas as ocorrências da string entrada (em qualquer combinação de maiúsculas e minúsculas) de cada uma das linhas dos arquivos contidos no diretório /var/www/.



5. Re: Como apagar palavras em varios arquivos diferentes com o sed? [RESOLVIDO]

Rick
rick_G

(usa Debian)

Enviado em 05/01/2015 - 15:40h


fiz um teste simples e funcionou perfeitamente, mas quando coloco a entrada que preciso apagar da um erro, a entrada seria essa: @require(dirname(__FILE__).'/path/file.php'), dai quando dou o comando sed -i '-s/@require(dirname(__FILE__).'/path/file.php')//gi' /var/www/* da o seguinte erro: sed: -e expression #1, char 36: unknown option to `s'
to fazendo algo errado?


6. Re: Como apagar palavras em varios arquivos diferentes com o sed? [RESOLVIDO]

Rick
rick_G

(usa Debian)

Enviado em 05/01/2015 - 16:44h

Muito obrigado mesmo amigo.
Não faz ideia de como me ajudou.


7. Re: Como apagar palavras em varios arquivos diferentes com o sed? [RESOLVIDO]

Fábio Berbert de Paula
fabio

(usa Debian)

Enviado em 05/01/2015 - 16:56h

Ricardo_Galossi escreveu:


fiz um teste simples e funcionou perfeitamente, mas quando coloco a entrada que preciso apagar da um erro, a entrada seria essa: @require(dirname(__FILE__).'/path/file.php'), dai quando dou o comando sed -i '-s/@require(dirname(__FILE__).'/path/file.php')//gi' /var/www/* da o seguinte erro: sed: -e expression #1, char 36: unknown option to `s'
to fazendo algo errado?


Sim, ocorre que tua expressão regular possui alguns caracteres especiais que precisam de escape. Se tiver bom inglês, leia o ótimo link a seguir:

http://unix.stackexchange.com/questions/32907/what-characters-do-i-need-to-escape-when-using-sed-in-...

Pra simplificar as coisas, vamos substituir os caracteres @ ( ) ' da sua expressão por . (ponto). Ponto indica qualquer caractere.

sed  's/.require.dirname.__FILE__....path.file.php..//gi' arquivo.php 


E pra deixar o comando ainda mais elegante, tu podes usar o find combinado com o sed:

find /var/www -name "*.php" -exec sed  's/.require.dirname.__FILE__....path.file.php..//gi' {} \; 


Sugiro uma lida no "man find" para entender o comando acima.

Um abraço.


8. Re: Como apagar palavras em varios arquivos diferentes com o sed? [RESOLVIDO]

Fábio Berbert de Paula
fabio

(usa Debian)

Enviado em 05/01/2015 - 16:57h

E o Ronaldo foi mais rápido que eu! kkkkkkkkkkk

Respondeu enquanto eu tava digitando a minha.

Boa!!!! Comunidade VOL é sinistra.


9. Re: Como apagar palavras em varios arquivos diferentes com o sed? [RESOLVIDO]

Rick
rick_G

(usa Debian)

Enviado em 05/01/2015 - 17:15h


Vlw pela ajuda Fabio, vou ler o link que tu mandou. Muito obrigado a todos mais uma vez.






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts