Mostrar todos los resultados pero resaltar las coincidencias de búsqueda

Mostrar todos los resultados pero resaltar las coincidencias de búsqueda

En bash, si quiero ejecutar un comando y mostrar solo líneas de salida que coincidan con un patrón determinado, puedo canalizarlo a grep, como

archivo de prueba

hello
there
my
friends

dominio

$ cat testfile | grep 'hello'
hello #this will be highlightd

esto resaltará la coincidencia de búsqueda y mostrará la línea completa en la que se encuentra. Puedo usar -Ay -Bpara mostrar líneas antes y después de esa línea. Mi pregunta es: ¿es posible ejecutar el comando y mostrar todos los resultados normalmente, pero resaltar las coincidencias de búsqueda como lo haría grep? entonces mi salida sería

hello #highlighted
there
my
friends

Respuesta1

Para utilizar un GREP de color para resaltar solo patrones coincidentes pero no cambiar la salida:

grep --color=always -e "^" -e "hello" testfile

El primer patrón coincidirá con todas las líneas (se imprimirán todas las líneas); el segundo patrón (y cualquier patrón siguiente) hará que el texto coincidente se resalte en color.

Dado que el primer patrón coincide con todas las líneas pero no coincide con un carácter imprimible, no agrega ningún resaltado de color, por lo que no compite ni interfiere con la legibilidad del texto resaltado.

Respuesta2

Agregue una opción -za su comando grep de GNU:

cat testfile | grep --color=always -z 'hello'

o más corto

grep --color=always -z 'hello' testfile

Respuesta3

Éste funciona tanto con GNU grep como con grep en FreeBSD:

grep --color=always 'hello\|$'

Coincide con el texto "hola" o ( \|) la cadena nula no imprimible al final de cada línea ( $). Es por eso que cada línea se imprime pero solo se resalta "hola".

Lo más probable es que ya lo haya --color=autoconfigurado en su shell. Entonces lo más probable es que no necesites especificar --color=always:

grep 'hello\|$'

También puede usar una versión más simple egrep(con expresiones regulares extendidas), donde |no es necesario escapar la expresión "o":

egrep 'hello|$'

Vea también una pregunta similar en StackOverflow:grep coloreado: visualización del archivo completo con coincidencias resaltadas

Respuesta4

Aquí hay una solución que utiliza ripgrep, un reemplazo moderno, más fácil de usar (IMO) y mucho más rápido para grep:

cat my-file | rg --passthru '<REGEX>'

También puedes personalizar fácilmente el "color del resaltador":

# dark red foreground with light yellow background:
cat my-file | rg --passthru --colors match:fg:124 --colors match:bg:229 '<REGEX>'

Ver man rg(versión en línea).


Para el uso diario creé un alias de shell:

# in .bashrc
alias hl='rg --passthru --colors match:fg:124 --colors match:bg:229'

Ahora es tan simple como cat my-file | hl '<REGEX>'.

información relacionada