Commande qui met en évidence l'expression régulière dans le texte?

14

Existe-t-il une commande qui met en évidence une certaine expression dans le texte?

Je cherche quelque chose comme la fonction de recherche en moins, mais avec une sortie de texte normale sur stdout, au lieu de la lessvisionneuse.

Exemple:

$ cat test.txt | highlight "an"

Les perspectives d' un retrait de l' OTAN ordonnée de Afgh un ist un a subi deux revers que le président Hamid Karzaï dem une limite ded les troupes des États-Unis un d l'Talib un arrêté des pourparlers de paix.

Il peut utiliser la couleur ou tout autre moyen pour mettre en surbrillance l'expression régulière spécifiée.

Franc
la source
1
possible doublon de highlightcommande
Gilles 'SO- arrête d'être méchant'
@Gilles, un peu, mais cette question avait des exigences beaucoup plus complexes.
cjm

Réponses:

17

Je ne sais pas si cela est dû à une fonctionnalité ou simplement à un effet secondaire caché, mais cela fonctionne dans GNU grep2.11:

grep --color 'an\|' test.txt
homme au travail
la source
10
C'est comme si tu faisais grep 'an' OR ''. Le ''ne correspond à rien à chaque emplacement de l'entrée. Seul le anest mis en surbrillance, car vous ne pouvez pas mettre en surbrillance le rien. :-)
Mikel
Génie pur. Cela n'a pas fonctionné pour moi, mais grep --color -e 'an' -e ' '(l'adaptation à un espace qui ne peut pas être coloré a fait l'affaire). Bien mieux que la tuyauterie sed -e ''/an/s//$(printf "\033[33;1m&\033[0m")/'', mais ce dernier est peut-être plus performant. Modifiez «an» pour un autre terme de recherche. ;)
sjas
Hou la la! J'ai utilisé cela pour modifier la commande que j'ai utilisée pour répertorier tous les bashrcalias, et maintenant tous mes alias sont surlignés en rouge. Super! alias aliases="clear;cat ~/.bashrc|grep --color \"alias\""
Nav
9

ack a une --passthruoption qui fera cela:

ack --passthru an test.txt
some_command | ack --passthru an -
cjm
la source
2
(+1) btw: dans le référentiel Ubuntu, le package (et l'exécutable) est appelé ack-grep... (le nom ackest appliqué à un convertisseur de code Kanji)
Peter.O
2

Vous pouvez essayer mon script. Il vous permettra soit de spécifier un fichier, soit de prendre une entrée standard. Vous pouvez définir une expression régulière Python pour le texte que vous souhaitez mettre en surbrillance. le texte en surbrillance est par défaut vert fluo (hé j'utilise un fond noir!) Mais vous pouvez changer le code couleur 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)

Voici un exemple.

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

Les perspectives d' un retrait de l' OTAN ordonnée de Afgh un ist un a subi deux revers que le président Hamid Karzaï dem une limite ded les troupes des États-Unis un d l'Talib un arrêté des pourparlers de paix.

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

Les perspectives d'un retrait ordonné de l' OTAN d' Afghanistan ont subi deux revers, le président Hamid Karzaï ayant demandé des limites aux troupes américaines et les talibans ayant interrompu les pourparlers de paix.

fthinker
la source
Le balisage gras stackexchange semble génial et c'est pourquoi la sortie a des étoiles supplémentaires. me bat.
fthinker
À utiliser <b>si vous devez mettre en gras une partie d'un mot.
cjm
0

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

la "couleur" fonctionne également. Vous pouvez également définir un alias pour que grep utilise toujours l'option:

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

Mettez ce qui précède dans /etc/profile.d/ quelque part ou dans votre .bashrc ou autre.

gerdesj
la source
1
Cela imprime uniquement les lignes correspondantes. Frank veut tout le texte, juste avec les correspondances mises en évidence.
cjm
Ajout d'un -C à ce qui précède - cela fonctionne mais c'est un peu désordonné!
gerdesj
3
Cela fonctionne, mais vous ne devez pas créer d'alias appelé grep. Avec -C 1000000vous, vous ne pourrez plus jamais grogner. Fais justealias highlight='grep --colour=auto -C 1000000'. The cat in the first example is also not necessary: Faites grep --colour = auto -C 100000 file`.
Matteo
Je me demande combien de mémoire cela va consommer sur un gros fichier. (Je n'ai jamais cherché à savoir comment grepgérer la collection de lignes de contexte.)
cjm