Buscar y reemplazar

Tip 31 Monobook imprimible Anterior Siguiente

creado 2001 · complejidad básica · versión 6.0

Vim proporciona el :s comando (sustituto) para buscar y reemplazar; este consejo muestra ejemplos de cómo sustituir. En algunos sistemas, gvim tiene Buscar y reemplazar en el menú Editar (: help: promptrepl), sin embargo, es más fácil usar el comando :s debido a su historial de línea de comando y su capacidad para insertar texto (por ejemplo, la palabra debajo del cursor) en los campos de búsqueda o reemplazo.

Búsqueda básica y reemplazo

El comando :substitute busca un patrón de texto y lo reemplaza con una cadena de texto. Hay muchas opciones, pero estas son las que probablemente desee:

:s/foo/bar/gBusque cada aparición de «foo» (solo en la línea actual) y reemplácela con «bar «.:%s/foo/bar/gBusque cada aparición de «foo» (en todas las líneas) y reemplácelo con «bar».:%s/foo/bar/gcCambie cada «foo» por «bar», pero primero pida confirmación.:%s/\<foo\>/bar/gcCambie solo las palabras completas que coincidan exactamente con «foo» por «bar»; pedir confirmación.:%s/foo/bar/gciCambie cada «foo» (no distingue entre mayúsculas y minúsculas debido al indicadori) por «bar»; pedir confirmación.:%s/foo\c/bar/gces igual porque\chace que la búsqueda no distinga entre mayúsculas y minúsculas. Esto puede ser necesario después de usar:set noignorecasepara que las búsquedas distingan entre mayúsculas y minúsculas (el valor predeterminado).:%s/foo/bar/gcICambie cada «foo» (distingue entre mayúsculas y minúsculas debido al indicadorI) por «bar»; pedir confirmación.:%s/foo\C/bar/gces igual porque\Chace que la búsqueda distinga entre mayúsculas y minúsculas. Esto puede ser necesario después de usar:set ignorecasepara que las búsquedas no distingan entre mayúsculas y minúsculas.

La bandera g significa global: se cambia cada aparición en la línea, en lugar de solo la primera. Esta sugerencia asume la configuración predeterminada para la opción "gdefault" y "edcompatible" (desactivada), que requiere que la g se incluirá la bandera en %s///g para realizar una sustitución global. El uso de :set gdefault crea confusión porque entonces %s/// es global, mientras que %s///g no lo es (es decir , g invierte su significado).

Al usar el indicador c, debe confirmar para cada coincidencia lo que hacer. Vim generará algo como: replace with foobar (y/n/a/q/l/^E/^Y)? (donde foobar es la parte de reemplazo del comando :s/.../.../. Puede escribir y que significa sustituir esta coincidencia, n para omitir esta coincidencia, a para sustituir esta y todas las coincidencias restantes ( «todas» las coincidencias restantes), q para salir del comando, l para sustituir esta coincidencia y salir (piense en «último»), ^E para desplazar la pantalla hacia arriba manteniendo presionada la tecla Ctrl y presionando E y ^Y para desplazar la pantalla hacia abajo manteniendo presionada la tecla Ctrl y presionando Y. Sin embargo, las dos últimas opciones solo están disponibles, si su Vim es una construcción normal, grande o enorme o si la función insert_expand se habilitó en el momento de la compilación (busque +insert_expand en la salida de :version).

Además, cuando se usa el indicador c, Vim saltará a t La primera coincidencia que encuentra a partir de la parte superior del búfer y le solicita confirmación para realizar el reemplazo en esa coincidencia. Vim aplica el IncSearch grupo destacado al texto coincidente para darle una pista visual sobre en qué coincidencia está operando (establecido en reverse de forma predeterminada para los tres tipos de términos a partir de Vim 7.3). Además, si se encuentra más de una coincidencia y tiene el resaltado de búsqueda habilitado con :set hlsearch, Vim resalta las coincidencias restantes con el Search grupo destacado . Si utiliza el resaltado de búsqueda, debe asegurarse de que estos dos grupos resaltados sean visualmente distintos o no podrá distinguir fácilmente qué coincidencia le pide Vim que sustituya.

Detalles

Rango de búsqueda:

Nota: A partir de Vim 7.3, sustituciones aplicadas a un rango definido por marcas o una selección visual (que usa un tipo especial de marcas «< y «>) no están delimitados por la posición de la columna de las marcas de forma predeterminada. En cambio, Vim aplica la sustitución a toda la línea en la que aparece cada marca, a menos que\%Vel átomo se usa en el patrón como::"<,">s/\%Vfoo/bar/g.

Al buscar:

.,*,\,especifica una colección /. Los rangos de caracteres se pueden representar con-; por ejemplo, una letra a, b, c, o el número 1 pueden coincidir con. Niega la colección concoincide con cualquier carácter excepto a, b, c o 1.\{#\}se usa para la repetición./foo.\{2\}coincidirá con foo y los dos caracteres siguientes. El\no es necesario en el cierre}por lo que/foo.\{2}hará lo mismo.\(foo\)hace una referencia inversa a foo. Los paréntesis sin escapes están literalmente emparejados. Aquí se requiere\para el cierre\).

Al reemplazar:

\res una nueva línea,\nes un byte nulo (0x00).\&es ampersand (& es el texto que coincide con el patrón de búsqueda).\0inserta el texto que coincide con el patrón completo\1inserta el texto de la primera referencia inversa.\2inserta la segunda referencia inversa, y así sucesivamente.

Puede usar otros delimitadores con sustituto:

:s#http://www.example.com/index.html#http://example.com/#

Guarde la escritura usando \zs y \ze para establecer el inicio y el final de un patrón. Por ejemplo, en lugar de:

:s/Copyright 2007 All Rights Reserved/Copyright 2008 All Rights Reserved/

Use:

:s/Copyright \zs2007\ze All Rights Reserved/2008/

Usando la palabra actual o registros

:%s//bar/gReemplaza cada coincidencia del último patrón de búsqueda con «bar». Por ejemplo, primero puede colocar el cursor en la palabrafooy luego presionar*para buscar esa palabra. El sustituto anterior cambiaría todas las palabras que coincidan exactamente con «foo» por «bar».:%s/foo/<c-r><c-w>/gReemplaza cada aparición de «foo» con la palabra debajo del cursor.<c-r><c-w>significa que presionas Ctrl-R y luego Ctrl-W. La palabra debajo del cursor se insertará como si la hubiera escrito.:%s/foo/<c-r><c-a>/gReemplaza cada aparición de «foo» con la PALABRA debajo del cursor (delimitada por espacios en blanco).<c-r><c-a>significa que presionas Ctrl-R y luego Ctrl-A. La PALABRA debajo del cursor se insertará como si la hubiera escrito.:%s/foo/<c-r>a/gReemplaza cada aparición de «foo» con el contenido del registro «a».<c-r>asignifica que presionas Ctrl-R y luegoa. El contenido del registro «a» se insertará como si lo hubiera escrito.:%s/foo/<c-r>0/gIgual que arriba, usando el registro 0 que contiene el texto del comando yank más reciente. Ejemplos de comandos yank (copiar) sonyi(que copia el texto entre paréntesis alrededor del cursor yy$que copia el texto del cursor hasta el final de la línea. Después de un comando yank que no especificó un registro de destino, el texto copiado se puede ingresar presionando Ctrl-R y luego0.:%s/foo/\=@a/gReemplaza cada aparición de «foo» con el contenido del registro «a».\=@aes una referencia para registrar «a». El contenido del registro «a» no se muestra en el comando. Esto es útil si el registro contiene muchas líneas de texto.:%s//<c-r>//gReemplaza cada coincidencia del último patrón de búsqueda con el registro/(el último patrón de búsqueda). Después de presionar Ctrl-R y luego/para insertar el último patrón de búsqueda (y antes de presionar Enter para ejecutar el comando), puede editar el texto para realizar los cambios necesarios.:%s/<c-r>*/bar/gReemplaza todas las apariciones del texto en el portapapeles del sistema (en el registro*) con «bar» (ver el siguiente ejemplo si es multilínea) . En algunos sistemas, seleccionar texto (en Vim u otra aplicación) es todo lo que se requiere para colocar ese texto en el registro*.:%s/<c-r>a/bar/gReemplaza todas las apariciones del texto en el registro «a» con «bar».<c-r>asignifica que presionas Ctrl-R y luegoa. El contenido del registro «a» se insertará como si lo hubiera escrito. Cualquier nueva línea en el registro «a» se inserta como^M

y no se encuentra. La búsqueda funciona si cada^Mse reemplaza manualmente con «\ n» (dos caracteres: barra invertida, «n»). Este reemplazo se puede realizar mientras escribe el comando::%s/<c-r>=substitute(@a,"\n","\\n","g")<CR>/bar/gLas"\n"(comillas dobles) representan la nueva línea de un solo carácter;"\\n"(comillas simples) representa dos barras invertidas seguidas de «n«.La funciónsubstitute()es evaluada por el registro de expresión<c-r>=(Ctrl-R=); reemplaza cada nueva línea con una sola barra invertida seguida de «n«. La<CR>indica que presionas Enter para finalizar la=expresión.:%s/<c-r>0/bar/gIgual que el anterior, usando el registro 0 que contiene el texto del comando yank más reciente.

Consulte Pegar registros en los comandos de búsqueda o dos puntos en lugar de usar el portapapeles.

Ejemplos adicionales

:%s/foo/bar/En cada línea, reemplace la primera aparición de «foo» con «bar».:%s/.*\zsfoo/bar/En cada línea, reemplace la última aparición de «foo» por «bar».:%s/\<foo\>//gEn cada línea, elimine todas las apariciones de la palabra «foo» completa.:%s/\<foo\>.*//En cada línea, elimine la palabra «foo» completa y todo el texto siguiente (hasta el final de la línea).:%s/\<foo\>.\{5}//En cada línea, elimine la primera aparición de la palabra completa «foo» y los cinco caracteres siguientes.:%s/\<foo\>\zs.*//En cada línea, borre todo el texto que sigue a la palabra completa «foo» (hasta el final de la línea).:%s/.*\<foo\>//En cada línea, elimine la palabra «foo» completa y todo el texto anterior (desde el principio de la línea).:%s/.*\ze\<foo\>//En cada línea, borre todo el texto que precede a la palabra completa «foo» (desde el principio de la línea).:%s/.*\(\<foo\>\).*/\1/En cada línea, elimine todo el texto que precede y sigue a la palabra completa «foo».:%s/\<foo\(bar\)\@!/toto/gEn cada línea, reemplace cada aparición de «foo» (que comienza una palabra y no va seguida de «bar») por «toto».:s/^\(\w\)/\u\1/Si el primer carácter al principio de la línea actual solo está en minúsculas, cámbielo a mayúsculas usando\u(consulte el cambio entre mayúsculas y minúsculas ).:%s/\(.*\n\)\{5\}/&\r/Inserta una línea en blanco cada 5 líneas. El patrón busca\(.*\n\)(cualquier línea, incluido el final de línea) repetida cinco veces (\{5\}). El reemplazo es&(el texto que se encontró), seguido de\r(nueva línea).:%s/\<foo\(\a*\)\>/\=len(add(list, submatch(1)))?submatch(0):submatch(0)/gObtenga una lista de resultados de búsqueda. (la lista debe existir) Establece el indicador

modified, debido al reemplazo, pero el contenido no se modifica. Nota: con un Vim suficientemente reciente (versión 7.3.627 o superior), puede simplificar esto a::%s/\<foo\(\a*\)\>/\=add(list, submatch(1))/gnEsto tiene la ventaja de que el búfer no se marcará como modificado y no Se crea un estado de deshacer adicional. La expresión en la parte de reemplazo se ejecuta en el sandbox y no se le permite modificar el búfer.

Casos especiales

Para sustituir patrones con el texto correspondiente que distingue entre mayúsculas y minúsculas, Michael Geddes » Se puede utilizar el complemento keepcase, por ejemplo:

:%SubstituteCase/\cHello/goodBye/gSustituya «Hello hello helLo HELLO» por «Goodbye goodbye goodbye GOODBYE»

Para cambiar las compensaciones en un archivo de parche (número de línea de un bloque), este pequeño fragmento se puede utilizar:

s/^@@ -\(\d\+\),\(\d\+\) +\(\d\+\),\(\d\+\) @@$/\="@@ -".eval(submatch(1)+offsetdiff).",".submatch(2)." +".eval(submatch(3)+offsetdiff).",".submatch(4)." @@"/g

Útil cuando queremos quitar algunos bloques de un parche, sin que el parche tenga que quejarse de las diferencias de desplazamiento.

Nota Debería intentar hacer la expresión más compacta, pero no sé cómo sin tener la posibilidad de modificar líneas no deseadas.

Ver también: usar sustituto

  • 63 Aplicar sustitutos a un bloque visual
  • 81 Sustituir caracteres y líneas fácilmente
  • 159 Guardar pulsaciones Sustituir y buscar
  • 406 Delimitadores alternativos para el reemplazo comando
  • 438 Buscar y reemplazar en una selección visual
  • 464 Buscar y reemplazar la palabra debajo del cursor
  • 479 Reemplazar sin escribir
  • 573 Repetir un sustituto desde la posición actual del cursor
  • 605 Reemplazar una palabra con el texto tirado
  • 654 Caracteres especiales en el comando sustituto
  • 755 Usar una expresión en comando de sustitución
  • 808 Reemplazar un bloque visual de texto con otro bloque de este tipo
  • 915 Usar g en lugar de sustituir
  • 971 Sustituir con números en aumento
  • 1114 Incrementar y reemplazar
  • 1501 Sustituir última búsqueda

Ver también: sustituir en búferes / archivos

  • 382 Buscar y reemplazar en varios búferes
  • : ayuda: sustituir
  • : ayuda cmdline-r anges
  • : patrón de ayuda
  • : ayuda «gdefault»
  • : registros de ayuda

PARA HACER
La sección grande «ver también» puede ser útil para los lectores. Necesitamos combinar algunos de los consejos relacionados (pero no haga que el resultado sea demasiado complejo). Incluí los números de los consejos para ayudar a los editores a realizar un seguimiento.

Quiero una sección breve que mencione que los sustitutos simples suelen ser los mejores manejado buscando y luego cambiando manualmente (y presionando . para repetir el último cambio). Además, puede decidir cómo cambiar cada instancia.Consulta Copiar o cambiar el resultado de búsqueda para una técnica en la que puedes presionar n para buscar la siguiente instancia y, luego, escribir cs para cambiar el resultado de búsqueda. a lo que sea.

¿Ha habido algún cambio recientemente en el funcionamiento de% s? De alguna manera, puedo usar < cr > y \ = @ como reemplazos, pero no puedo usarlos como búsquedas y reemplazos.

Si describe exactamente lo que hace y lo que sucede, es posible que pueda ayudar, aunque vea hacer preguntas. JohnBeckett (charla) 02:15, 1 de junio de 2019 (UTC)

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *