Qual è lo strumento migliore per trovare e sostituire espressioni regolari su più file?
Domanda
Preferibilmente strumenti gratuiti, se possibile.
Inoltre, la possibilità di cercare più espressioni regolari e ciascuna di sostituirla con stringhe diverse sarebbe un bonus.
Soluzione
Perl. Seriamente, rende le cose di amministratore di sistema molto più facili. Ecco un esempio:
perl -pi -e 's / qualcosa / qualcosa / g' * .log
Altri suggerimenti
sed è semplice e veloce:
sed -e "s/pattern/result/" <file list>
puoi anche unirti ad esso con find:
find <other find args> -exec sed -e "s/pattern/result/" "{}" ";"
Textpad fa un buon lavoro su Windows. Ed è anche un ottimo editor.
Ho scritto uno strumento da riga di comando gratuito per Windows per farlo. Si chiama rxrepl , supporta la ricerca di Unicode e file. Alcuni potrebbero trovarlo utile.
Non sorprende che Perl faccia un ottimo lavoro nel gestirlo, insieme a una shell decente:
for file in @filelist ; do
perl -p -i -e "s/pattern/result/g" $file
done
Questo ha lo stesso effetto (ma è più efficiente e senza le condizioni di gara) di:
for file in @filelist ; do
cat $file | sed "s/pattern/result/" > /tmp/newfile
mv /tmp/newfile $file
done
L'editor di directory di Emacs ha la funzione `dired-do-query-replace-regexp 'per cercare e sostituire un regexp su una serie di file contrassegnati.
In Windows, mi piaceva WinGrep
In Ubuntu, utilizzo Regexxer.
Per trovare e sostituire più file su Windows ho trovato molto utile rxFind .
Per Mac OS X, TextWrangler fa il lavoro.
Il mio preferito è PowerGrep di JGSoft. Si interfaccia con RegexBuddy che può aiutarti a creare e testare l'espressione regolare, esegue automaticamente il backup di tutte le modifiche (e fornisce funzionalità di annullamento), offre la possibilità di analizzare più directory (con modelli di nome file) e supporta persino formati di file come Microsoft Word, Excel e PDF.
Vorrei bash + find + sed.
Vim per il salvataggio (e presidente ;-)). Prova:
vim -c "argdo! s:foo:bar:gci" <list_of_files>
(Adoro l'interruttore -c di Vim, è magico. O se avevi già in Vim e aperto i file, ad esempio:
vim <list_of_files>
Emetti solo:
:bufdo! s:foo:bar:gci
Ovviamente sed
e perl
è anche capace.
HTH.
Ho il lusso di Unix e Ubuntu; In entrambi, uso gawk per tutto ciò che richiede la ricerca e la sostituzione riga per riga, in particolare per riga per riga per sottostringa. Recentemente, questo è stato il più veloce per l'elaborazione di 1100 modifiche rispetto a milioni di righe in centinaia di file (una directory) Su Ubuntu sono un fan di regexxer
sudo apt-get install regexxer
In Windows esiste un'alternativa gratuita che funziona al meglio: Notepad ++
Vai a " Cerca " - > " Trova in File " ;. Si può dare directory, pattern di file, impostare espressioni regolari, quindi visualizzare in anteprima le corrispondenze e infine sostituire tutti i file in modo ricorsivo.
Adoro questo strumento:
Ti dà un " mentre digiti " anteprima della tua espressione regolare ... FANTASTICO per chi non è esperto in RE ... ed è super veloce nel cambiare centinaia o migliaia di file alla volta ...
E poi ti ANNULLA anche le tue modifiche ...
Molto bello ...
Patrick Steil - http://www.podiotools.com
se "textpad" è una risposta valida, suggerirei Sublime Text a mani basse.
Le modifiche multi-cursore sono un modo ancora più efficiente per effettuare sostituzioni in generale, ma la sua " Trova nei file " è il livello più alto per regex in blocco / sostituzioni semplici da trovare.
la ricerca regex di jEdit e la sostituzione nei file è abbastanza decente. Leggermente eccessivo se lo usi solo per quello, però. Inoltre, non supporta la sostituzione multi-espressione richiesta.
Ho trovato utile lo strumento RxFind (OSS gratuito).
Parentesi (codice sorgente, deb / Ubuntu, OSx e Windows) ha una buona visualizzazione dei risultati, che consente di selezionarli singolarmente applicare la sostituzione. Puoi effettuare ricerche in base al testo standard, con distinzione tra maiuscole e minuscole e regex. Molto importante: è possibile escludere modelli di file e directory nella ricerca.
Da almeno 25 anni utilizzo Emacs per sostituzioni su larga scala su un gran numero di file. Esegui etags
per specificare qualsiasi set di file da cercare:
$ etags file1.txt file2.md dir1/*.yml dir2/*.json dir3/*.md
Quindi apri Emacs ed esegui tag-query-replace
, che richiede regex e sostituzione:
\b\(foo\)\b
\1bar