Encontre e substitua texto em vários arquivos

84

Quero saber como encontrar e substituir um texto específico em vários arquivos, como no Notepad ++ no tutorial vinculado.

por exemplo: http://cybernetnews.com/find-replace-multiple-files/

Faruk Uzun
fonte
Não terá a interface gráfica, mas eu recomendaria que você examinasse sed (man sed). É o editor de fluxo que existe desde o início do UNIX.
Apolinsky

Respostas:

136

Aqui, uso o sed para substituir todas as ocorrências da palavra "cybernetnews" por "cybernet" em todos os arquivos com a extensão c, no diretório / home / user / directory /.

find /home/user/directory -name \*.c -exec sed -i "s/cybernetnews/cybernet/g" {} \;

Uma variação mais genérica na qual você pesquisa recursivamente a partir do diretório de execução e opera apenas em arquivos regulares, legíveis e graváveis:

find ./ -type f -readable -writable -exec sed -i "s/cybernetnews/cybernet/g" {} \;
gregtczap
fonte
2
Considerados para isso, porque é um método tal eficiente
Sabacon
4
Votado porque sed é a melhor opção da IMO, mas a resposta seria mais útil se você explicasse os componentes da resposta (pessoalmente, não estou familiarizado e curioso sobre o {} \;)
sequoia mcdowell
5
@sequoiamcdowell Woo! Eu perdi isso! Desculpa. As chaves significam basicamente "para cada correspondência" e o ponto-e-vírgula escapado (\;) é para evitar a análise dupla. Não queremos que o shell e o sed compatíveis com bourne tentem analisar o comando, apenas sed.
@ Christopher, como isso funciona se a palavra contiver espaços como cyber net news? Como posso converter isso para cyber net?
Khurshid Alam
11
@KhurshidAlam Use a classe de caractere com a opção -e:sed -i -e "s/cyber\snet\snews/cyber net/g"
27

O editor de fluxo, sed, é um utilitário poderoso para esse tipo de trabalho e é a minha primeira escolha, no entanto, se você quiser fazer isso a partir de um editor de texto comum usando um aplicativo nativo baseado no Ubuntu, sugiro que você analise o Jedit , Está disponível nos repositórios e pode ser instalado digitando no seu console:

sudo apt-get install jedit

Inicie o jedit, clique no item de menu Pesquisar, na lista de menus, clique no item Pesquisar no Diretório, você verá a caixa de diálogo abaixo:

Caixa de diálogo Pesquisa Jedit na pasta

Isso é semelhante ao do Notepad ++ e faz a mesma coisa, acredito que é isso que você deseja.

Sabacon
fonte
Isso foi perfeito para quando eu estava procurando por uma linha inteira de código e hesitava em escapar de cada caractere especial de regex, se eu tivesse feito a mesma coisa sed.
IQAndreas
você pode substituir os blocos de código (como html, javascript etc.) em segundos.
Lepe
Isso não funciona em um grande número de arquivos, depois de algumas horas não havia feito uma substituição, enquanto o geany levou alguns minutos para encontrar todas as ocorrências. Essa pode não ser uma pesquisa e substituição eficiente, mas aqueceu bem a sala.
precisa
19

Outra opção da GUI é o regexxer : captura de tela regexxer

int_ua
fonte
Funciona perfeitamente (se você já conhece o Regex), obrigado.
Ernest
11
Mesmo que, se você não conhece regex, pode usar essa ferramenta como uma ferramenta simples de pesquisa e substituição de cadeias e ele fará o trabalho para você, sem necessidade de regex ou qualquer coisa.
Mohd Abdul Mujib
13
perl -pi -e 's/oldtext/newtext/g' *

substitui qualquer ocorrência de texto antigo por texto novo em todos os arquivos na pasta atual. No entanto, você terá que escapar de todos os caracteres especiais perl no texto antigo e no novo texto usando a barra invertida.

Michael K
fonte
9

Verifique com o Geany , é o substituto perfeito da NPP para Linux. Você pode fazer exatamente isso e usar a regex.

Stefano Mtangoo
fonte
Eu amo Geany! É o meu editor favorito e é poderoso o suficiente.
Pisu
11
Até onde eu sei, o Geany 1.23.1 (fornecido com o Ubuntu 13.10) permite pesquisar vários arquivos usando o regex, mas não os substituindo.
Drew Noakes
Você pode pesquisar e substituir no Geany vários arquivos se abrir todos eles e, em seguida, usar o botão "na sessão" na caixa de diálogo Pesquisar / substituir.
MV.
11
Como você abre 5000 arquivos listados na guia de mensagens?
precisa
11
Ok, o regexxer era praticamente o que eu estava pedindo, eu tinha pulado mais cedo devido ao nome dele ter regex e apenas evito qualquer coisa a ver com regex. Mas eu estava errado, e essa ferramenta tem exatamente o que é necessário para pesquisar e substituir.
Mohd Abdul Mujib
2

Você pode usar esse script, copiar código e criar um arquivo find_and_replace_in_files.sh.

Eu o modifiquei um pouco; por favor me diga sua opinião.

# *****************************************************************************************
# find_and_replace_in_files.sh
# This script does a recursive, case sensitive directory search and replace of files
# To make a case insensitive search replace, use the -i switch in the grep call
# uses a startdirectory parameter so that you can run it outside of specified directory - else this script will modify itself!
# *****************************************************************************************

!/bin/bash
# **************** Change Variables Here ************
startdirectory="/your/start/directory"
searchterm="test"
replaceterm="test=ok!"
# **********************************************************

echo "***************************************************"
echo "* Search and Replace in Files Version 01-Aug-2012 *"
echo "***************************************************"

i=0; 

  for file in $(grep -l -R $searchterm $startdirectory)
    do
      cp $file $file.bak
      sed -e "s/$searchterm/$replaceterm/ig" $file > tempfile.tmp
      mv tempfile.tmp $file

    let i++;

      echo "Modified: " $file
    done

echo " *** All Done! *** Modified files:" $i
dimitrios
fonte
2

Outro programa é o Searchmonkey .

O SearchMonkey é um aplicativo Gtk leve que visa substituir o achado / grep complicado por uma interface de usuário elegante que fornece rapidamente uma marcação mostrando os locais e a quantidade de correspondências de texto. O objetivo é fornecer uma ferramenta de pesquisa simples de usar e acessível para usuários finais e desenvolvedores de software.

vrcmr
fonte
2
find . -name "*.txt" |xargs sed -i "s/searched_Text/replacement_Text/g"

funciona para mim no fedora

user328359
fonte
Você pode adicionar uma linha explicando como esta melhora ao longo askubuntu.com/a/84013/158442
Muru
@muru Ele roda muito menos sedinstâncias! Portanto, é muito mais rápido em termos de tempo de CPU. Como o tempo de acesso ao arquivo seria limitado, acho que não é muito mais rápido no tempo do relógio, mas reduz a carga do sistema. O Note xargscolocará muitos nomes de arquivos, como hunters, na linha de comando de um único sedcomando - preenchendo o tamanho do buffer disponível com base no comprimento dos caminhos.
Volker Siegel
Hmm ... se isso for fechado, eu poderia substituí-lo por um que explique claramente por que é melhor do que o votado.
Volker Siegel
@VolkerSiegel que pode ser alcançado em +vez de \;em find, certo?
muru 19/09/14
11
@muru Possivelmente ... Minha "ferramenta certa para o trabalho" claramente prefere xargs, mas você está certo; de man find: -exec command {} +: ... The command line is built in much the same way that xargs.... Me faz pensar em linhas de comando git filter-branch...;)
Volker Siegel
2

Uma solução muito simples: substitua em todos os *.txtarquivos da pasta string_1por string_2:

sed -i 's/string_1/string_2/g' *.txt
Helmut P.
fonte
Ótima resposta! Apenas alguma adição. Se você deseja substituir uma string em qualquer arquivo do diretório atual de forma recursiva, em seguida, tente o seguinte:sed -i 's/string_1/string_2/g' $(grep -rEl 'string_1' ./)
Drugan