2012-06-22 18 views
8

Tuve una situación en la que quería reemplazar FOO con BAR a través de un archivo; sin embargo, solo quiero hacerlo en ciertos lugares, por ejemplo, entre las líneas 68-104, 500-537 y 1044-1195. En la práctica se me cayó marcadores (MA, MB, MC, ...) en las líneas de interés, y me encontré lo siguiente:Vim búsqueda y reemplazo - confinar a ciertas líneas

:'a,'b s/FOO/BAR/g | 'c,'d s/FOO/BAR/g | 'e,'f s/FOO/BAR/g 

tuve que repetir esto decenas de veces con diferentes términos de búsqueda y reemplazo s/CAT/DOG, etc., que se convirtió en un problema tener que volver a escribir la línea de comando cada vez. Tuve suerte porque solo tenía 3 lugares en los que quería limitar mi búsqueda (imagínese si hubiera 30 o 40, qué desordenado sería la línea de comando).

Si no se escribe una función, ¿hay alguna manera más clara de hacerlo?

En una nota relacionada. Copié FOO a la 's' (búsqueda) se registra, y un bar a la 'r' (reemplazar) y trató de una línea de comandos de

:'a,'b s/\[email protected]/\[email protected]/ | 'c,'d s/\[email protected]/\[email protected]/ | 'e,'f s/\[email protected]/\[email protected]/ 

Esto habría ahorrado yo tenga que volver a escribir la línea de comandos cada tiempo, pero lamentablemente no funcionó. El bit de reemplazo estaba bien \ = @ r, pero los \ = @ s en el patrón de búsqueda dieron un error.

Cualquier consejo sería apreciado.

+0

También puede utilizar CONTROL-P y DE CONTROL -N (creo) para pasar por los comandos anteriores. Esto debería eliminar la necesidad de volver a escribir comandos. – jahroy

+0

es habitual aceptar una respuesta, si fue útil. – epsilonhalbe

Respuesta

2

En lugar de utilizar el uso marcador de éste:

:68,104s/FOO/BAR/g << substitue from line 68 to 104

Esto debería hacer su trabajo un poco más fácil y clara.

5

Si necesita realizar un conjunto de operaciones en línea (como sustituciones) en un grupo de diferentes rangos de líneas, un truco que puede usar es hacer que esas líneas se vean diferentes al agregar primero un prefijo (que no es) t compartido por cualquiera de las otras líneas).

La forma en que suelo hacer esto es aplicar sangrías al archivo completo con algo como >G en la primera línea, y luego usar :s/^ /X/ comandos o bloqueo visual para reemplazar los espacios iniciales con X en las líneas que quiero.

Luego use :g junto con :s. por ejemplo:

:%g/^X/s/FOO/BAR/g 
:%g/^X/s/BAZ/QUUX/g 

Finalmente, elimine los prefijos temporales.

+0

Veo en qué se encuentra - poniendo una marca temporal en la primera columna para cada línea en mi rango. Esa es una gran idea, gracias. (Desafortunadamente no funcionaría en este caso ya que el archivo de texto era código fuente, y quería compilar a medida que avanzaba). –

+1

Podría haber puesto un comentario en cada línea para distinguir las líneas de código, que no deberían interferir con compilación. – epsilonhalbe

2

Con q:, puede recuperar las líneas de comandos anteriores y editarlos como un buffer de Vim normal, para que pueda reemplazar rápidamente FOO y BAR con otra cosa, a continuación, volver a ejecutar la línea con Introduzca.

El s/\[email protected]/\[email protected]/ no funciona; como dijiste, esto solo funciona en la parte de reemplazo. Sin embargo, para el patrón, puede utilizar Ctrl +RCtrl +Rs para insertar el contenido del registro s, en lugar de \[email protected]. Preferiblemente use el registro predeterminado, luego es un simple s//, pero probablemente ya lo sepa.

+0

¿Qué significa _q: _? – jahroy

+0

¡Ah! No sabía el comando q: ¡lindo! –

3

inspirado por @ respuesta de Vdt:

no estoy seguro, pero se podría escribir todas las sustituciones en un archivo y fuente de ese archivo, creo. substitutions.vim:

68,104s/FOO/BAR/g 
168,204s/FOO/BAR/g 
618,644s/FOO/BAR/g 
681,1014s/FOO/BAR/g 
. 
. 
. 
68,104s/BAZ/BOOO/g 
168,204s/BAZ/BOOO/g 

y luego :so substitutions.vim tal vez usted también puede usar esto para varios archivos de una misma estructura. puede agregar un e para agregar un mensaje de error de ignorar, si no está claro que las sustituciones se encuentran en los bloques de línea correspondientes.

+0

Sí, eso habría funcionado también. No conocía la bandera 'e', ​​gracias. –

+0

para la 'e' tengo que dar puntales a http://stackoverflow.com/questions/11146763/about-a-key-binding-to-remove-trailing-spaces-and-save/11146887#11146887 esta respuesta por @ pb2q – epsilonhalbe

+0

ps Acabo de probar esto en un archivo de prueba, y funciona como un encanto. Gracias. –

2

Cuando se realiza sobre un pliegue cerrado, las sustituciones se limitan a ese pliegue.

  1. doblar cada región
  2. poner el cursor en uno de tapa cerrada
  3. realizar la sustitución: :s/foo/bar<CR>
  4. pase a la siguiente tapa cerrada con zj o zk
  5. utilizar el historial de línea de comandos: :<C-p><CR> o :<Up><CR> para realizar la misma sustitución
  6. repetir ...

También puede agregar la bandera c al final de su sustitución para que Vim le solicite una confirmación antes de realizarla. Esto puede ser tedioso si tienes muchas coincidencias.

4

Con el fin de deshacerse de la necesidad de volver a escribir patrón de búsqueda, la sustitución cuerda y banderas, uno puede simplemente usar el comando :& con el & bandera:

:'a,'bs/pat/str/g|'c,'d&&|'e,'f&& 
+0

: & es uno nuevo para mí. Gracias, será muy útil. –

+0

@Dave: De hecho, es práctico. Si entiendo la pregunta correctamente, usar el comando ': &' resuelve el problema indicado, ¿no es así? –

+0

En el ejemplo que di, sí, es perfecto gracias. Sin embargo, si tuviera muchas ubicaciones en las que quería buscar, creo que la respuesta de @ eipson-2-halbe podría ser más práctica. Supongamos que tengo 40 ubicaciones, y luego obtener un archivo de texto externo podría ser más manejable que poner 40 'xxx,' yyy && entradas en la línea de comando. ¡Una combinación de ambos métodos es probablemente el camino a seguir! –

Cuestiones relacionadas