Trova e sostituisci il testo in più file


Risposte:


136

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" {} \;

2
Votato per questo perché è un metodo così efficiente
Sabacon,

4
Votato perché sed è la scelta migliore IMO, ma la risposta sarebbe più utile se spiegassi i componenti della risposta (personalmente, non ho familiarità con e curioso di {} \;)
sequoia mcdowell

5
@sequoiamcdowell Woo! Mi è mancato questo! Scusate. Le parentesi graffe significano sostanzialmente "per ogni corrispondenza" e il punto e virgola fuggito (\;) serve a prevenire il doppio analisi. Non vogliamo che la shell e sed compatibili con Bourne stiano cercando di analizzare il comando, solo sed.

@Christopher come funziona se la parola contiene spazi come cyber net news? Come posso convertirlo in cyber net?
Khurshid Alam,

1
@KhurshidAlam Usa la classe di caratteri con l' sed -i -e "s/cyber\snet\snews/cyber net/g"

27

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:

Ricerca Jedit nella finestra di dialogo Cartella

Questo è simile a quello di Notepad ++ e fa la stessa cosa, credo che sia questo ciò che vuoi.


Questo era perfetto per quando stavo cercando un'intera riga di codice ed era titubante sfuggire a ogni singolo personaggio speciale regex se avessi fatto la stessa cosa sed.
IQAndreas,

puoi sostituire i blocchi di codice (come html, javascript, ecc.) in pochi secondi.
lepe

Questo non funziona su un gran numero di file, dopo un paio d'ore non ha fatto una sostituzione, mentre Geany ha impiegato alcuni minuti per trovare tutte le occorrenze. Questa potrebbe non essere una ricerca efficiente e sostituire, ma ha riscaldato bene la stanza.
Mark Aroni,

19

Un'altra opzione della GUI è regexxer : screenshot di regexxer


Funziona perfettamente (se hai già familiarità con Regex), grazie.
Ernest

1
Anche, se non conosci regex, puoi usare questo strumento come un semplice strumento di ricerca e sostituzione delle stringhe e farà il lavoro per te, senza bisogno di regex o altro.
Mohd Abdul Mujib,

13
perl -pi -e 's/oldtext/newtext/g' *

sostituisce qualsiasi occorrenza di oldtext con newtext in tutti i file nella cartella corrente. Tuttavia dovrai sfuggire a tutti i caratteri speciali perl all'interno di oldtext e newtext usando la barra rovesciata.


9

Verificare con Geany , è la perfetta sostituzione NPP per Linux. Puoi fare esattamente questo e in più puoi usare regex.


Adoro Geany! È il mio editor preferito ed è abbastanza potente.
Pisu,

1
Per quanto ne so, Geany 1.23.1 (impacchettato con Ubuntu 13.10) consente di cercare più file usando regex, ma non di sostituirli.
Drew Noakes,

Puoi cercare e sostituire in Geany più file se li apri tutti e quindi utilizzando il pulsante "in sessione" nella finestra di dialogo Cerca / Sostituisci.
MV.

1
Come si aprono 5000 file elencati nella scheda Messaggi?
Mark Aroni,

1
Ok, il regexxer era praticamente quello che stavo chiedendo, l'avevo appena ignorato a causa del suo nome con regex e tendo a evitare qualsiasi cosa abbia a che fare con regex. Ma ho sbagliato, e questo strumento ha esattamente ciò che è necessario per la ricerca e la sostituzione.
Mohd Abdul Mujib,


2

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

2

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.


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

lavora per me su fedora


Potresti aggiungere una riga che spiega come questo migliora rispetto a askubuntu.com/a/84013/158442
muru,

@muru Esegue molte meno sedistanze! 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 xargsinserirà molti, come hundereds, di nomi di file sulla riga di comando di un singolo sedcomando, riempiendo la dimensione del buffer disponibile in base alla lunghezza dei percorsi.
Volker Siegel,

Hmm ... se questo viene chiuso, potrei sostituirlo con uno che spiega chiaramente perché è meglio di quello votato.
Volker Siegel,

@VolkerSiegel che può essere raggiunto con +invece di \;in find, giusto?
Muru,

1
@muru Forse ... Il mio "strumento rigoroso per il lavoro" preferisce chiaramente l'istinto 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...;)
Volker Siegel,

2

Una soluzione molto semplice: sostituire in tutti i *.txtfile nella cartella string_1con string_2:

sed -i 's/string_1/string_2/g' *.txt

Bella risposta! Solo qualche aggiunta. Se si desidera sostituire ricorsivamente una stringa in qualsiasi file della directory corrente, provare questo:sed -i 's/string_1/string_2/g' $(grep -rEl 'string_1' ./)
drugan
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.