2012-03-02 10 views
5

C'è un modo per sostituire tutte le occorrenze di una stringa nei file in Vim utilizzando una combinazione di args and argdo commands. Sfortunatamente c'è un inconveniente con questa soluzione: aprirà tutti i file che potrebbero essere un problema per i progetti di grandi dimensioni. Qualcuno sa più compatto ed efficiente in termini di memoria?Vim: trova e sostituisci un progetto di grandi dimensioni?

+3

Devi usare vim? Userei sed, è uno strumento migliore per il lavoro. –

+0

@GregHewgill Mi piacerebbe avere la possibilità di confermare una particolare modifica come il flag 'gc' in Vim regexp. L'uso di 'sed -i' sembra un po 'pericoloso per me. – nab

+0

Se si osservano comunque tutte le modifiche, utilizzare sed e quindi controllare la differenza risultante. –

risposta

6
find projectfolder -type f -exec grep -Iq 'pattern' {} \; -exec vim {} + 
+0

C'è un piccolo problema con questa soluzione: 'Vim: Attenzione: l'input non proviene da un terminale' che risulta in una console rotta dopo aver smesso di vim. Il motivo è che xargs esegue i suoi comandi argomento in un ambiente in cui l'input standard non è il terminale dell'utente. Quindi suggerirei qualcosa del modulo: 'find projectfolder -type f -exec grep -Iq 'pattern' {} \; -print | xargs sh -c ' nab

+0

@nab Buon punto. Dopo alcuni test, ho trovato (sorprendentemente, almeno per me) che cambiando '-print0 | xargs ... 'per' -exec ... + 'ha funzionato. In realtà ha un senso, 'find' da solo non legge lo stdin così i suoi bambini possono. È la prima differenza funzionale tra i due che ho visto. – Kevin

3

Ecco come lo faccio (quando non sto usando perl):

find . -name '*.java' -exec vim +'%s/OldName/NewName/gc' +'wq' {} \; 

cioè sostituire "VecchioNome" con "NewName" in tutti "* .java" file, ma mi chiede conferma per conferma per ogni sostituzione.

+0

Grazie! E come lo fai quando usi Perl? – nab

+0

'trova. -name '* .java' -exec perl -i.BAK -wpe 's/OldName/NewName/g' {} \; 'salva il vecchio file con estensione" .BAK "in modo da poter quindi rivedere le modifiche con' diff'. – Manish

Problemi correlati