Comando che evidenzia regex nel testo?


14

Esiste un comando che evidenzia una certa espressione nel testo?

Sto cercando qualcosa di simile alla funzione 'cerca' in meno, ma con un normale output di testo su stdout, invece del lessvisualizzatore.

Esempio:

$ cat test.txt | highlight "an"

Le prospettive per un ritiro ordinato la NATO da AFGH un ist an subito due battute d'arresto come presidente Hamid Karzai dem un limiti ded contro le truppe degli Stati Uniti un d il Talib un fermato i colloqui di pace.

Potrebbe usare il colore o qualsiasi altro mezzo per evidenziare l'espressione regolare specificata.



@Gilles, in qualche modo, ma quella domanda aveva requisiti molto più complessi.
cjm

Risposte:


17

Non sono sicuro che ciò sia dovuto a una caratteristica o ad alcuni effetti collaterali nascosti, ma funziona in GNU grep2.11:

grep --color 'an\|' test.txt

10
È come se stessi facendo grep 'an' OR ''. Corrisponde ''correttamente a nulla in ogni posizione nell'input. anViene evidenziato solo il , perché non è possibile evidenziare il nulla. :-)
Mikel

Genio puro. Non ha funzionato per me, ma grep --color -e 'an' -e ' '(l'abbinamento per uno spazio, che non può essere colorato ha fatto il trucco). Molto meglio del piping sed -e ''/an/s//$(printf "\033[33;1m&\033[0m")/'', ma forse quest'ultimo è più performante. Cambia "an" per un altro termine di ricerca. ;)
sjas,

Wow! Ho usato questo per modificare il comando che ho usato per elencare tutti gli bashrcalias, e ora tutti i miei alias sono evidenziati in rosso. Super! alias aliases="clear;cat ~/.bashrc|grep --color \"alias\""
Nav

9

ack ha --passthruun'opzione che lo farà:

ack --passthru an test.txt
some_command | ack --passthru an -

2
(+1) a proposito: nel repository di Ubuntu, il pacchetto (ed eseguibile) si chiama ack-grep... (il nome ackviene applicato a un convertitore di codice Kanji)
Peter.O

2

Puoi provare questo mio copione. Ti permetterà di specificare un file o accetta input standard. È possibile definire un'espressione regolare Python per il testo che si desidera evidenziare. il testo evidenziato diventa di default verde neon (ehi, io uso uno sfondo nero!) Ma puoi cambiare il codice colore 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)

Ecco un esempio

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

Le prospettive per un ritiro ordinato la NATO da AFGH un ist an subito due battute d'arresto come presidente Hamid Karzai dem un limiti ded contro le truppe degli Stati Uniti un d il Talib un fermato i colloqui di pace.

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

Le prospettive di un ordinato ritiro della NATO dall'Afghanistan hanno subito due battute d'arresto quando il presidente Hamid Karzai ha chiesto limiti alle truppe degli Stati Uniti e i talebani hanno interrotto i colloqui di pace.


stackexchange il markup in grassetto sembra funky ed è per questo che l'output ha stelle extra. mi batte.
pensare il

Utilizzare <b>se è necessario mettere in grassetto parte di una parola.
cjm

0

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

"color" funziona anche. Puoi anche definire un alias per fare in modo che grep usi sempre l'opzione:

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

Inserisci quanto sopra in /etc/profile.d/ da qualche parte o nel tuo .bashrc o altro.


1
Questo stampa solo le linee corrispondenti. Frank vuole l'intero testo, solo con le partite evidenziate.
cjm

Aggiunto un -C a quanto sopra - funziona ma è un po 'disordinato!
Gerdesj,

3
Funziona, ma si dovrebbe non creare un alias chiamato grep. Con -C 1000000te non potrai mai più grep. Basta fare alias highlight='grep --colour=auto -C 1000000'. The cat in the first example is also not necessary: grep --colour = auto -C 100000 file`.
Matteo

Mi chiedo quanta memoria consumerà su un file di grandi dimensioni. (Non ho mai esaminato come grepgestisce la raccolta di linee di contesto.)
cjm
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.