Befehl, der Regex im Text hervorhebt?

14

Gibt es einen Befehl, der einen bestimmten Ausdruck im Text hervorhebt?

Ich suche so etwas wie die Suchfunktion in weniger, aber mit normaler Textausgabe auf stdout anstelle des lessViewers.

Beispiel:

$ cat test.txt | highlight "an"

Die Aussichten für eine geordnete NATO Rückzug aus AFGH eine ist ein erlitten zwei Rückschläge als Präsident Hamid Karzai DM eine ded Grenzen für Truppen der Vereinigten Staaten ein d die Talib ein Friedensgespräche gestoppt.

Der angegebene reguläre Ausdruck kann mit Farbe oder auf andere Weise hervorgehoben werden.

Frank
quelle
1
Mögliches Duplikat des highlightKommandos
Gilles 'SO - hör auf, böse zu sein'
@ Gilles, etwas, aber diese Frage hatte weitaus komplexere Anforderungen.
CJM

Antworten:

17

Ich bin mir nicht sicher, ob dies auf eine Funktion oder einen versteckten Nebeneffekt zurückzuführen ist, aber dies funktioniert in GNU grep2.11:

grep --color 'an\|' test.txt
Mann bei der Arbeit
quelle
10
Es ist wie du tust grep 'an' OR ''. Das ''stimmt an jeder Stelle in der Eingabe erfolgreich mit nichts überein. Es wird nur das anhervorgehoben, weil Sie das Nichts nicht hervorheben können. :-)
Mikel
Wahres Genie. Es hat bei mir nicht geklappt, aber grep --color -e 'an' -e ' '(passend zu einem Raum, der nicht gefärbt werden kann, hat es geklappt). Viel besser als Piping sed -e ''/an/s//$(printf "\033[33;1m&\033[0m")/'', aber vielleicht ist Letzteres performanter. Ändern Sie 'an' für einen anderen Suchbegriff. ;)
sjas
Beeindruckend! Ich habe damit den Befehl bashrcgeändert, mit dem ich alle Aliase aufgelistet habe, und jetzt sind alle meine Aliase rot hervorgehoben. Super! alias aliases="clear;cat ~/.bashrc|grep --color \"alias\""
Nav
9

ack hat eine --passthruOption, die dies erledigt:

ack --passthru an test.txt
some_command | ack --passthru an -
cjm
quelle
2
(+1) Übrigens: Im Ubuntu-Repo heißt das Paket (und die ausführbare Datei) ack-grep... (der Name ackwird auf einen Kanji-Code-Konverter angewendet)
Peter.O
2

Sie können dieses Skript von mir ausprobieren. Sie können entweder eine Datei angeben oder Standardeingaben vornehmen. Sie können einen regulären Python-Ausdruck für den Text definieren, den Sie hervorheben möchten. Der hervorgehobene Text ist standardmäßig neongrün (hey, ich verwende einen schwarzen Hintergrund!). Sie können jedoch den ANSI-Farbcode ändern .

#!/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)

Hier ist ein Beispiel.

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

Die Aussichten für eine geordnete NATO Rückzug aus AFGH eine ist ein erlitten zwei Rückschläge als Präsident Hamid Karzai DM eine ded Grenzen für Truppen der Vereinigten Staaten ein d die Talib ein Friedensgespräche gestoppt.

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

Die Aussicht auf einen geordneten NATO- Rückzug aus Afghanistan erlitt zwei Rückschläge, als Präsident Hamid Karzai die Begrenzung der US-Truppen forderte und die Taliban die Friedensgespräche einstellten.

fthinker
quelle
StackExchange-Markup in Fettdruck scheint irre zu sein, weshalb die Ausgabe zusätzliche Sterne enthält. schlägt mich.
Fthinker
Verwenden <b>Sie diese Option, wenn ein Teil eines Wortes fett gedruckt werden muss.
cjm
0

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

"Farbe" funktioniert auch. Sie können auch einen Alias ​​definieren, damit grep immer die Option verwendet:

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

Fügen Sie das Obige irgendwo in /etc/profile.d/ ein oder in Ihre .bashrc oder was auch immer.

gerdesj
quelle
1
Das druckt nur passende Zeilen. Frank möchte den gesamten Text, nur mit hervorgehobenen Übereinstimmungen.
cjm
Hinzugefügt ein -C zu den oben - es funktioniert, ist aber ein bisschen chaotisch!
Gerdesj
3
Es funktioniert, aber Sie sollten keinen Alias ​​namens grep erstellen. Mit -C 1000000dir wirst du nie wieder greifen können. Mach einfach alias highlight='grep --colour=auto -C 1000000'. The cat in the first example is also not necessary: grep --colour = auto -C 100000 file`.
Matteo
Ich frage mich, wie viel Speicher für eine große Datei benötigt wird. (Ich habe nie untersucht, wie grepmit der Sammlung von Kontextzeilen
umgegangen wird