2012-03-02 20 views
5

Hay una manera de reemplazar todas las ocurrencias de una cadena en archivos en Vim usando una combinación de args and argdo commands. Lamentablemente, hay una desventaja con esta solución: abrirá todos los archivos que pueden ser un problema para proyectos grandes. ¿Alguien sabe de forma más compacta y eficiente de memoria?Vim: ¿Buscar y reemplazar en un proyecto grande?

+3

¿Debe usar vim? Usaría sed, es una herramienta mejor para el trabajo. –

+0

@GregHewgill Me gustaría tener la oportunidad de confirmar un cambio en particular, como la bandera 'gc' en Vim regexp. Solo usar 'sed -i' me parece un poco peligroso. – nab

+0

Si va a ver todos los cambios de todos modos, use sed e inspeccione la diferencia resultante. –

Respuesta

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

Hay un pequeño problema con esta solución: 'Vim: Advertencia: la entrada no proviene de un terminal', lo que da como resultado una consola descompuesta después de salir de vim. El motivo es que xargs ejecuta sus comandos de argumento en un entorno en el que la entrada estándar no es el terminal del usuario. Así que sugeriría algo de la forma: 'find projectfolder -type f -exec grep -Iq 'pattern' {} \; -print | xargs sh -c ' nab

+0

@nab Buen punto. Después de algunas pruebas, encontré (sorprendentemente, al menos para mí) que cambiar el '-print0 | xargs ... 'to' -exec ... + 'trabajado. En realidad tiene algún sentido, 'find' solo no lee stdin para que sus hijos puedan. Es la primera diferencia funcional entre los dos que he visto. – Kevin

3

Así es como lo hago (cuando no estoy usando perl):

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

es decir, reemplazar "OldName" con "NuevoNombre" en todos los "* .java" archivos, pero me impulsan para la confirmación de cada sustitución.

+0

¡Gracias! ¿Y cómo lo haces cuando estás usando Perl? – nab

+0

'encontrar. -name '* .java' -exec perl -i.BAK -wpe 's/OldName/NewName/g' {} \; 'guarda el archivo anterior con una extensión" .BAK "para que pueda revisar los cambios con' diff'. – Manish

Cuestiones relacionadas