¿Comando que resalta la expresión regular en el texto?

14

¿Hay un comando que resalta una cierta expresión en el texto?

Estoy buscando algo como la función 'buscar' en menos, pero con salida de texto normal en stdout, en lugar del lessvisor.

Ejemplo:

$ cat test.txt | highlight "an"

Las perspectivas de una retirada de la OTAN ordenada de AFGH un ist un sufrido dos reveses como presidente Hamid Karzai dem un límite ded sobre las tropas de Estados Unidos una d la Talib una detuvo las conversaciones de paz.

Podría usar color o cualquier otro medio para resaltar la expresión regular especificada.

Franco
fuente
1
posible duplicado de highlightcomando
Gilles 'SO- deja de ser malvado'
@Gilles, de alguna manera, pero esa pregunta tenía requisitos mucho más complejos.
cjm

Respuestas:

17

No estoy seguro si esto se debe a una función o simplemente a algún efecto secundario oculto, pero esto funciona en GNU grep2.11:

grep --color 'an\|' test.txt
hombre trabajando
fuente
10
Es como si estuvieras haciendo grep 'an' OR ''. El ''éxito no coincide con nada en cada ubicación de la entrada. Solo anse resalta el, porque no se puede resaltar la nada. :-)
Mikel
Genio puro. No funcionó para mí, pero grep --color -e 'an' -e ' '(hacer coincidir un espacio, que no se puede colorear, funcionó). Mucho mejor que la tubería sed -e ''/an/s//$(printf "\033[33;1m&\033[0m")/'', pero tal vez este último sea más eficiente. Cambie 'an' por otro término de búsqueda. ;)
sjas
¡Guauu! Usé esto para modificar el comando que usé para enumerar todos los bashrcalias, y ahora todos mis alias están resaltados en rojo. ¡Súper! alias aliases="clear;cat ~/.bashrc|grep --color \"alias\""
Nav
9

ack tiene una --passthruopción que hará esto:

ack --passthru an test.txt
some_command | ack --passthru an -
cjm
fuente
2
(+1) por cierto: en el repositorio de Ubuntu, el paquete (y el ejecutable) se llama ack-grep... (el nombre ackse aplica a un convertidor de código Kanji)
Peter.O
2

Puedes probar este script mío. Le permitirá especificar un archivo o tomará una entrada estándar. Puede definir una expresión regular de Python para el texto que desea resaltar. el texto resaltado está predeterminado en verde neón (¡oye, uso un fondo negro!) Pero puede cambiar el código de color ANSI .

#!/usr/bin/env python

import sys
import re

def highlight_text(text,pat):
    def replacement_funk(matchobj):  return '\x1b[42m%s\x1b[0m'%matchobj.group(0)
    return re.sub(pat,replacement_funk,text)

if __name__ == '__main__':
    if len(sys.argv) == 2:
        input = sys.stdin
        pat = sys.argv[1]
    elif len(sys.argv) == 3:
        input = open(sys.argv[2])
        pat = sys.argv[1]
    else:
        sys.stderr.write("colorme pattern [inputfile]")
    text = input.read()
    print highlight_text(text,pat)

Aquí hay un ejemplo.

blessburn@blessburn:/tmp$ cat test.txt | ./colorme.py an

Las perspectivas de una retirada de la OTAN ordenada de AFGH un ist un sufrido dos reveses como presidente Hamid Karzai dem un límite ded sobre las tropas de Estados Unidos una d la Talib una detuvo las conversaciones de paz.

blessburn@blessburn:/tmp$ ./colorme.py '(Af.*? |NA[\w]{2})' test.txt

Las perspectivas de una retirada ordenada de la OTAN de Afganistán sufrieron dos reveses cuando el presidente Hamid Karzai exigió límites a las tropas de Estados Unidos y los talibanes suspendieron las conversaciones de paz.

pensador
fuente
El marcado en negrita stackexchange parece funky y es por eso que la salida tiene estrellas adicionales. me gana
fthinker
Úselo <b>si necesita poner en negrita parte de una palabra.
cjm
0

$cat test.txt | grep --colour=auto -C 100000 an

"color" también funciona. También puede definir un alias para que grep use siempre la opción:

alias grep='grep --colour=auto -C 100000'

Ponga lo anterior en /etc/profile.d/ en algún lugar o su .bashrc o lo que sea.

gerdesj
fuente
1
Eso solo imprime líneas coincidentes. Frank quiere todo el texto, solo con las coincidencias resaltadas.
cjm
Se agregó una -C a lo anterior, ¡funciona pero es un poco desordenado!
gerdesj
3
Funciona pero debe no crear un alias llamado grep. Contigo -C 1000000nunca podrás volver a jugar. Simplemente haga alias highlight='grep --colour=auto -C 1000000'. The cat in the first example is also not necessary: grep --colour = auto -C 100000 file`.
Matteo
Me pregunto cuánta memoria va a consumir en un archivo grande. (Nunca he investigado cómo se grepmaneja la colección de líneas de contexto.)
cjm