Sustituir cadenas en el editor vi / vim

Cuando estamos editando textos una de las tareas más pesadas que nos ocurren, y ocurre muchas veces, es tener que sustituir unas cadenas por otras. Por suerte, en vi tenemos la opción de hacerlo muy rápidamente y con mucha versatilidad.

El comando para sustituir cadenas es:

:${rango_de_lineas}s/${patron_antiguo}/${cadena_nueva}/${opciones}

Veamos este comando por partes.

Rango de líneas

  • :s -> indica que se modifiquen las ocurrencias sólo en la línea actual
  • :s% -> indica que se modifiquen las ocurrencias en todas las líneas
  • :s1,3 -> indica que se modifiquen las ocurrencias de las líneas 1 a 3
  • :s3 -> indica que se modifiquen las ocurrencias en la línea 3

Patrones y cadenas

A la hora de buscar coincidencias, podemos usar cadenas de texto o expresiones regulares, que las modificaremos por cadenas de texto.

  • /antigua/nueva/ -> sustituye antigua por nueva
  • /^antigua/nueva/ -> sustituye antigua si está al comienzo de línea por nueva
  • /antigua$/nueva/ -> sustituye antigua por nueva si la línea acaba por antigua
  • /a.*a/nueva/ -> sustituye cualquier ocurrencia desde que encuentra la primera «a» de la línea hasta la última «a» de la línea
  • /^[a-z]* /nueva/ -> sustituye las palabras formadas por letras minúsculas que se encuentren al comienzo de una línea

Y cualquier otro patrón que se nos ocurra o que nuestros conocimientos de expresiones regulares nos permitan.

Opciones

  • Sin opciones -> sustituye sólo una ocurrencia por línea
  • g -> sustituye todas las ocurrencias
  • c -> pide confirmación antes de hacer el cambio
  • i -> ignora la diferencia entre las mayúsculas y minúsculas en el patrón
  • I -> diferencia las mayúsculas y minúsculas en el patrón
Ejemplos

Partamos de este fichero:

antigua antigua antigua antigua antigua antigua
antigua antigua antigua antigua antigua antigua
antigua antigua antigua antigua antigua antigua
antigua antigua antigua antigua antigua antigua
antigua antigua antigua antigua antigua antigua

Si queremos sustituir la primera ocurrencia de la palabra antigua por nueva en la línea 2:

:2s/antigua/nueva/
antigua antigua antigua antigua antigua antigua
nueva antigua antigua antigua antigua antigua
antigua antigua antigua antigua antigua antigua
antigua antigua antigua antigua antigua antigua
antigua antigua antigua antigua antigua antigua

Si, en lugar de sólo en la línea 2, queremos que sustituya de la 2 a la 4:

:2,4s/antigua/nueva/
antigua antigua antigua antigua antigua antigua
nueva antigua antigua antigua antigua antigua
nueva antigua antigua antigua antigua antigua
nueva antigua antigua antigua antigua antigua
antigua antigua antigua antigua antigua antigua

Que sustituya de la 2 a la 4, pero en lugar de una única ocurrencia, todas las ocurrencias de la línea:

:2,4s/antigua/nueva/g
antigua antigua antigua antigua antigua antigua
nueva nueva nueva nueva nueva nueva
nueva nueva nueva nueva nueva nueva
nueva nueva nueva nueva nueva nueva
antigua antigua antigua antigua antigua antigua

De la línea 2 a la 4, cambiar los finales de línea que coincidan con antigua por nueva:

:2,4s/antigua$/nueva/g

 

Deja una respuesta

Tu dirección de correo electrónico no será publicada.