buscar líneas que contienen un patrón pero que no contienen un segundo patrón

15

Necesito buscar líneas que contengan alguna palabra pero que no contengan una segunda palabra.

Por ejemplo, busque líneas que contengan la palabra "Esto" pero no la palabra "rojo"

para que para un archivo que contenga estas líneas

This is a blue coat
This is a red  coat
This is a purple coat
That is a coat

La búsqueda localizaría solo la primera y la tercera línea.

Gracias por cualquier consejo!

Leo Simon
fuente
Puede usar el complemento LogiPat que se distribuye con Vims más nuevos
Christian Brabandt

Respuestas:

23

Puede usar este comando para imprimir líneas que contienen Thisy no red:

:g/\(.*This\)\&\(.*red\)\@!
  • \&separa las ramas como un lógico ANDporque queremos las líneas que satisfacen las dos condiciones (ramas),
  • \(.*This\)es la primera rama, podría ser simplemente Thispero es más genérico de esa manera,
  • \(.*red\)\@!es la segunda rama, \@!significa "coincidencia de ancho cero si el átomo anterior no coincide", como un lógico NOT.

En otras palabras:

\(.*This\)  \&  \(.*red\)\@!
°°°°°°°°°°  °°  °°°°°°°°°°°°
'This'      AND NOT 'red'
romainl
fuente
Muchas gracias, esto es muy parecido a una consulta a través de texto formateado. Pude usar esto para encontrar funciones que faltan docstrings.
Joshua Detwiler
1

Mira esta publicación.

Combínalo con @romainl answer y podrás hacer lo que quieras.

Ejemplo: Digamos que quiero agregar un consta las funciones que no las tiene.

    handleChange = value => {

Script VIM:

%s/\([ ]*\)\(\w* = .*$\)\&^\(\&\(.*const.*\)\@!.\)*$/\1const \2/gc

Salida:

    const handleChange = value => {

Explicación:

\([ ]*\)\(\w* = .*$\)

- Consígueme todas las líneas que tiene word =

\&

- combinar reglas

^\(\&\(.*const.*\)\@!.\)*$

- la línea no debe contener const.

ATOzTOA
fuente