Feb 122015
 

vi (y su versión mejorada vim)  es el editor de texto más extendido en los sistemas Unix. La potencia de este editor se debe en gran medida a la posibilidad de utilizar expresiones regulares para seleccionar y editar con un sólo comando todas las líneas que contienen un determinado patrón de texto.

En ocasiones, puede ser necesario seleccionar y editar todas las líneas que NO contienen un determinado patrón de texto. En este artículo se explica cómo realizar este tipo de acción en vi.

Caso 1

Supongamos que estamos editando un fichero de texto. Algunas de las líneas contienen la palabra “vivienda”, y queremos eliminar dichas líneas. En vi, el comando para realizar este cambio sería:

:g/vivienda/d

Pero si lo que queremos es eliminar las líneas que NO contienen la palabra “vivienda”, podemos utilizar el comando:

:v/vivienda/d

En lugar del comando “d”, podemos utilizar cualquier otro comando de edición. Por ejemplo, si queremos insertar el literal “NO COINCIDE ” al comienzo de cada línea que no contiene la palabra vivienda:

:v/vivienda/s/^/NO COINCIDE /

Caso 2

Un caso más complicado es aquel en el que queremos seleccionar las líneas que contienen un texto u otro. Por ejemplo, si queremos eliminar las líneas en las que aparece la palabra “casa” o “vivienda”:

:g/\(casa\|vivienda\)/d

sustituyendo “g” por “v”, seleccionaremos todas las líneas que no contienen ni “casa” ni “vivienda”:

:v/\(casa\|vivienda\)/d

Caso 3

Para seleccionar todas las líneas que contienen ambas palabras “casa” y “vivienda”, en cualquier orden, utilizamos el operador “\&”, como en el siguiente ejemplo:

:g/.*casa\&.*vivienda/d

sustituyendo “g” por “v”, seleccionaremos todas la líneas que no contienen ambas palabras.

Caso 4

Por último, podemos querer seleccionar todas las líneas que contienen las palabras “casa” y “vivienda”, y no contienen las palabras “grande” ni “pequeña”. Para construir esta expresión, utilizamos el operador negación “\@!”:

:g/^\(.*casa\)\&\(.*vivienda\)\&\(.*grande\|.*pequeña\)\@!

En las expresiones regulares que hemos presentado en este artículo, los caracteres especiales “(“, “)”, “&”, “|” y “@” deben ir precedidos del carácter “\”. Para evitarlo, podemos utilizar el modificador \v, y hacer así más legible la expresión regular. Utilizando “\v”, la última expresión se podría escribir como:

:g/\v^(.*casa)&(.*vivienda)&(.*grande|.*pequeña)@!

 Publicado por en 5:38 pm

 Deja un comentario

(requerido)

(requerido)