¿Cómo hacer una búsqueda inversa en Vim? (es decir, obtener líneas que no contienen patrón)

¿Cómo hacer una búsqueda inversa en Vim? (es decir, obtener líneas que no contienen patrón)

Con greppuedo hacer un grep -v "my search"para obtener todas las líneas sin "mi búsqueda".

ConsedPuedo sed '/baz/!s/foo/bar/g'encontrar texto de reemplazo en líneas sin "baz".

¿Hay alguna manera de hacer lo mismo en Vim? ¿Y es posible hacerlo sin la sintaxis "s///" y solo usando la sintaxis de búsqueda "/"?

Respuesta1

:g/pattern/

coincide con todas las líneas donde se encuentra el patrón.

:v/pattern/

hace lo contrario. Ver :h globalpara más detalles.

Puedes usarlo así:

:v/pattern/norm Ipattern not found - <CR>

anteponer "patrón no encontrado -" a cada línea que no tenga "patrón" o

:v/pattern/s/nrettap/pattern

reemplazar "nrettap" con "patrón" en cada línea que no tenga "patrón".

Ejemplos artificiales, sí.

Respuesta2

Para buscar las líneasnoque contenga foo, por ejemplo, haga:

/^\(\(.*foo.*\)\@!.\)*$

Fuente:http://vim.wikia.com/wiki/Search_for_lines_not_containing_pattern_and_other_helpful_searches

Respuesta3

Usando el comando :vEditar El enfoque tradicional para encontrar líneas que no coinciden con un patrón es usar el:v comando:

:v/Warning/p

Un buen truco cuando se trabaja con un archivo de registro grande en el que desea filtrar tantas líneas irrelevantes como sea posible antes de comenzar su búsqueda real es guardar el archivo con un nombre temporal y eliminar todas las líneas que no coincidan allí:

:sav junk.log
:v/warning/d

Ahora está editando un clon de su archivo original con todas las líneas que no coinciden con la "advertencia" eliminadas y puede editarlo a voluntad.

Árbitro:https://vim.fandom.com/wiki/Search_for_lines_not_containing_pattern_and_other_helpful_searches

Respuesta4

Otro enfoque es hacer "grep externo"; del manual (:help :grep):

5.2 External grep

Vim can interface with "grep" and grep-like programs (such as the GNU
id-utils) in a similar way to its compiler integration (see |:make| above).

                                *:gr* *:grep*
:gr[ep][!] [arguments]  Just like ":make", but use 'grepprg' instead of
            'makeprg' and 'grepformat' instead of 'errorformat'.
            When 'grepprg' is "internal" this works like
            |:vimgrep|.  Note that the pattern needs to be
            enclosed in separator characters then.
            If the encoding of the program output differs from the
            'encoding' option, you can use the 'makeencoding'
            option to specify the encoding.

                                *:lgr* *:lgrep*
:lgr[ep][!] [arguments] Same as ":grep", except the location list for the
            current window is used instead of the quickfix list.

Para mí, grepprgestá configurado en el valor predeterminado (ver con :set grepprg) que usa el externo grep, y así podría hacerlo

:grep -v 'my_pattern' %

donde %se refiere al nombre del archivo actual (ver :help :_%).

Después de esto, se puede usar :copeno :lopenpara buscar los resultados en las listas de arreglos rápidos o de ubicaciones (dependiendo de si se ha usado :grepo , respectivamente).:lgrep

NOTA

El grep externo siempre funcionará en elsalvadoarchivo, y no en el búfer. Tenga esto en cuenta cuando obtenga resultados inconsistentes.

información relacionada