Voglio sapere come posso trovare e sostituire un testo specifico in più file come in Notepad ++ nell'esercitazione collegata.
ad es .: http://cybernetnews.com/find-replace-multiple-files/
Voglio sapere come posso trovare e sostituire un testo specifico in più file come in Notepad ++ nell'esercitazione collegata.
ad es .: http://cybernetnews.com/find-replace-multiple-files/
Risposte:
Qui uso sed per sostituire ogni ricorrenza della parola "cybernetnews" con "cybernet" in ogni file con l'estensione, c, nella directory, / home / user / directory /.
find /home/user/directory -name \*.c -exec sed -i "s/cybernetnews/cybernet/g" {} \;
Una variante più generica in cui cerchi ricorsivamente dalla directory di esecuzione e operi solo su file normali, leggibili e scrivibili:
find ./ -type f -readable -writable -exec sed -i "s/cybernetnews/cybernet/g" {} \;
cyber net news
? Come posso convertirlo in cyber net
?
Lo stream editor, sed, è una potente utility per questo tipo di lavoro ed è la mia prima scelta, tuttavia, se vuoi farlo da un normale editor di testo usando un'applicazione nativa basata su Ubuntu, ti suggerirei di dare un'occhiata a Jedit , È disponibile nei repository e può essere installato digitando nella console:
sudo apt-get install jedit
Avvia jedit, fai clic sulla voce del menu di ricerca, nell'elenco dei menu, fai clic sulla voce Cerca nella directory, ti verrà presentata la seguente finestra di dialogo:
Questo è simile a quello di Notepad ++ e fa la stessa cosa, credo che sia questo ciò che vuoi.
sed
.
Un'altra opzione della GUI è regexxer :
Verificare con Geany , è la perfetta sostituzione NPP per Linux. Puoi fare esattamente questo e in più puoi usare regex.
Ho scritto una piccola sceneggiatura proprio per questa cosa. Se hai solo bisogno delle basi e non hai familiarità con sed ecc, dai un'occhiata qui: http://www.csrdu.org/nauman/2010/12/30/bash-script-to-find-and-replace-in -a-set-di-file /
Lo script è il seguente:
for f in submit_*;
do sed "s/old_db_name/new_db_name/" < $f > a_$f ;
mv a_$f $f ;
done
Puoi usare questo script, copiare il codice e creare un file find_and_replace_in_files.sh
.
L'ho modificato un po '; per favore dimmi la tua opinione.
# *****************************************************************************************
# 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
Un altro programma è Searchmonkey .
SearchMonkey è un'applicazione Gtk leggera che mira a sostituire l'ingombrante find / grep con un'interfaccia utente intuitiva che fornisce rapidamente un mark-up che mostra le posizioni e la quantità di corrispondenze di testo. L'obiettivo è fornire uno strumento di ricerca semplice da usare e accessibile sia per gli utenti finali che per gli sviluppatori di software.
find . -name "*.txt" |xargs sed -i "s/searched_Text/replacement_Text/g"
lavora per me su fedora
sed
istanze! Quindi è molto più veloce in termini di tempo della CPU. Poiché il tempo di accesso ai file sarebbe limitato, penso che non sia molto più veloce in tempo di clock, ma dà un carico di sistema inferiore. Nota xargs
inserirà molti, come hundereds, di nomi di file sulla riga di comando di un singolo sed
comando, riempiendo la dimensione del buffer disponibile in base alla lunghezza dei percorsi.
+
invece di \;
in find
, giusto?
xargs
, ma hai ragione; da man find
: -exec command {} +
: ... The command line is built in much the same way that xargs...
. Mi fa pensare alle righe di comando di git filter-branch
...;)
Una soluzione molto semplice: sostituire in tutti i *.txt
file nella cartella string_1
con string_2
:
sed -i 's/string_1/string_2/g' *.txt
sed -i 's/string_1/string_2/g' $(grep -rEl 'string_1' ./)