Convencer a grep para que genere todas las líneas, no solo aquellas con coincidencias

Convencer a grep para que genere todas las líneas, no solo aquellas con coincidencias

Digamos que tengo el siguiente archivo:

$ cat test

test line 1
test line 2
line without the search word
another line without it
test line 3 with two test words
test line 4

De forma predeterminada, grepdevuelve cada línea que contiene el término de búsqueda:

$ grep test test

test line 1
test line 2
test line 3 with two test words
test line 4

Pasar el --colorparámetro a grephará que se resalte la parte de la línea que coincide con la expresión de búsqueda, pero aún así solo devuelve líneas que contienen la expresión. ¿Hay alguna manera de grepgenerar cada línea del archivo fuente, pero resaltar las coincidencias?

Mi terrible truco actual para lograr esto (al menos en archivos que no tienen más de 10000 líneas consecutivas sin coincidencias) es:

$ grep -B 9999 -A 9999 test test

Captura de pantalla de los dos comandos.

Si grepno puede lograr esto, ¿existe otra herramienta de línea de comandos que ofrezca la misma funcionalidad? he jugueteado conack, pero tampoco parece tener una opción para ello.

Respuesta1

grep --color -E "test|$" yourfile

Lo que estamos haciendo aquí es compararlo con el $patrón y el patrón de prueba, obviamente $no tiene nada que colorear, por lo que solo el patrón de prueba recibe color. Simplemente -Eactiva la coincidencia de expresiones regulares extendida.

Puedes crear una función a partir de ella fácilmente como esta:

highlight () { grep --color -E "$1|$" "${@:1}" ; }

Respuesta2

ack --passthru --color string file

para Ubuntu y Debian, use ack-grep en lugar de ack

ack-grep --passthru --color string file

Respuesta3

Otra forma de hacer estoadecuadamenteyportátilmentewith grep(además de usar dos expresiones regulares con alternancia como en la respuesta aceptada) es a través del patrón nulo (y, respectivamente, una cadena nula).
Debería funcionar igualmente bien con ambos -Einterruptores -Fya que,según el estándar:

-E
    Match using extended regular expressions. 
    [...] A null ERE shall match every line.

y

-F
    Match using fixed strings.
    [...] A null string shall match every line.

Así que es simplemente cuestión de correr

grep -E -e '' -e 'pattern' infile

y respectivamente

grep -F -e '' -e 'string' infile

Respuesta4

ripgrep

Usar ripgrepcon su --passthruparámetro:

rg --passthru pattern file.txt

Es uno de losherramientas de grepping más rápidas, ya que está construido sobreMotor de expresiones regulares de Rustque utiliza autómatas finitos, SIMD y optimizaciones literales agresivas para agilizar la búsqueda.

--passthru- Imprima líneas coincidentes y no coincidentes.

Otra forma de lograr un efecto similar es modificando su patrón para que coincida con la cadena vacía. Por ejemplo, si está buscando usando, rg fooentonces usar rg "^|foo"emitirá cada línea en cada archivo buscado, pero solo se resaltarán las apariciones de foo. Este indicador permite el mismo comportamiento sin necesidad de modificar el patrón.

información relacionada