vim: encuentra una línea que contiene un patrón que no está en las líneas vecinas

vim: encuentra una línea que contiene un patrón que no está en las líneas vecinas

Quiero encontrar una manera de mostrar todas las líneas que contienen cierto patrón, pero las líneas vecinas (anterior, siguiente) no.

por ejemplo: digamos que el patrón es la palabra "PATRÓN"

1.#########################

2.#########PATRÓN#########

3.##############################

entonces la segunda línea es válida y se muestra.

PERO

1.#########################

2.#########PATRÓN#########

3.#########PATRÓN#########

4.##############################

entonces la segunda y tercera líneas no son válidas, por lo tanto no se mostrarán

Respuesta1

Querrá utilizar grupos de captura de expresiones regulares, de la siguiente manera:

/\v%(PATTERN.*\n.*)@<!(PATTERN)%(.*\n.*\1)@!

Ejemplo

Esto puede parecer aterrador, pero en realidad es bastante simple:

  1. \vse utiliza para habilitar"muy mágico"expresiones regulares (evita el uso de barras invertidas para la mayoría de los caracteres especiales)
  2. PATTERN.*\n.*es PATTERN, seguido de cualquier cosa, una nueva línea y cualquier otra cosa
  3. (...)@<!es el patrón de la mirada atrás negativa: significa queno quiero¿Qué hay entre las llaves para existir? Entonces, en nuestro caso, todos los pasos 2no deberían existir.
  4. (PATTERN)Esta es nuestra palabra real, ¡esto debería existir! Lo capturamos con llaves para uso futuro.
  5. .*\n.*\1es cualquier cosa, una nueva línea, cualquier cosa otra vez, y nuestro grupo capturado (ver paso 4)
  6. %(...)@!es una anticipación negativa, como antes, no queremos que exista lo que hay entre llaves.

Básicamente, queremos PATTERN, que es:

  • no precedido por una línea que contengaPATTERN
  • no seguido por una línea que contienePATTERN

información relacionada