
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, grep
devuelve 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 --color
parámetro a grep
hará 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 grep
generar 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
Si grep
no 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 -E
activa 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 -E
interruptores -F
ya 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 ripgrep
con su --passthru
pará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 foo
entonces usarrg "^|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.