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/
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/
Respostas:
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" {} \;
cyber net news
? Como posso converter isso para cyber net
?
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:
Isso é semelhante ao do Notepad ++ e faz a mesma coisa, acredito que é isso que você deseja.
sed
.
Outra opção da GUI é o regexxer :
Verifique com o Geany , é o substituto perfeito da NPP para Linux. Você pode fazer exatamente isso e usar a regex.
Eu escrevi um pequeno roteiro para essa coisa. Se você só precisa do básico e não está familiarizado com o sed etc, dê uma olhada aqui: http://www.csrdu.org/nauman/2010/12/30/bash-script-to-find-and-replace-in -um-conjunto-de-arquivos /
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
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
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.
find . -name "*.txt" |xargs sed -i "s/searched_Text/replacement_Text/g"
funciona para mim no fedora
sed
instâ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 xargs
colocará muitos nomes de arquivos, como hunters, na linha de comando de um único sed
comando - preenchendo o tamanho do buffer disponível com base no comprimento dos caminhos.
+
vez de \;
em find
, certo?
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
...;)
Uma solução muito simples: substitua em todos os *.txt
arquivos da pasta string_1
por string_2
:
sed -i 's/string_1/string_2/g' *.txt
sed -i 's/string_1/string_2/g' $(grep -rEl 'string_1' ./)