Encontre e substitua o texto em vários arquivos

67

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

por exemplo, link

    
por Faruk Uzun 30.11.2011 / 14:58

10 respostas

114

Aqui eu uso sed para substituir cada ocorrência 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 em que você pesquisa recursivamente a partir do diretório de execução e opera somente em arquivos graváveis, legíveis e regulares:

find ./ -type f -readable -writable -exec sed -i "s/cybernetnews/cybernet/g" {} \;
    
por user8290 30.11.2011 / 15:15
26

O editor de fluxo, sed, é um poderoso utilitário para este tipo de trabalho e é a minha primeira escolha, no entanto, se você quiser fazer isso de um editor de texto comum usando um aplicativo nativo baseado no Ubuntu, eu sugiro que você veja o Jedit, ele 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 de pesquisa, na lista do menu, clique no item Pesquisar no diretório, você verá a caixa de diálogo abaixo:

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

    
por Sabacon 30.11.2011 / 16:57
17

Outra opção de GUI é regexxer :

    
por int_ua 30.11.2011 / 18:26
10
perl -pi -e 's/oldtext/newtext/g' *

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

    
por Michael K 30.11.2011 / 15:11
9

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

    
por Stefano Mtangoo 30.11.2011 / 15:35
3

Eu escrevi um pequeno roteiro apenas para essa coisa. Se você precisa apenas do básico e não está familiarizado com o sed etc., dê uma olhada aqui: link

O script é o seguinte:

for f in submit_*;
  do sed "s/old_db_name/new_db_name/" < $f > a_$f ;
  mv a_$f $f ;
done
    
por recluze 02.12.2011 / 03:09
2

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

Eu 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
    
por dimitrios 01.08.2012 / 17:36
2

Outro programa é Searchmonkey .

  

O SearchMonkey é um aplicativo Gtk leve, que tem como objetivo substituir o pesado / achado de busca por uma interface de usuário sofisticada 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.

    
por vrcmr 14.09.2012 / 23:44
2
find . -name "*.txt" |xargs sed -i "s/searched_Text/replacement_Text/g"

funciona para mim no fedora

    
por user328359 19.09.2014 / 02:22
2

Uma solução muito simples: substitua todos os arquivos *.txt na pasta string_1 por string_2 :

sed -i 's/string_1/string_2/g' *.txt
    
por Helmut P. 25.04.2015 / 13:01