Comando que destaca regex no texto?

14

Existe um comando que destaca uma certa expressão no texto?

Estou procurando algo como a função 'search' em menos, mas com saída de texto normal no stdout, em vez do lessvisualizador.

Exemplo:

$ cat test.txt | highlight "an"

Perspectivas para uma retirada ordenada NATO de AFG um ist um sofreu dois contratempos como presidente Hamid Karzai dem um limite ded sobre tropas dos Estados Unidos um d o Talib um suspendeu as negociações de paz.

Poderia usar cores ou qualquer outro meio para destacar a expressão regular especificada.

Frank
fonte
1
possível duplicata de highlightcomando
Gilles 'SO- stop be evil'
@ Gilles, de certa forma, mas essa pergunta tinha requisitos muito mais complexos.
Cjm 15/03

Respostas:

17

Não tenho certeza se isso é devido a um recurso ou apenas a alguns efeitos colaterais ocultos, mas isso funciona no GNU grep2.11:

grep --color 'an\|' test.txt
homem a trabalhar
fonte
10
É como você está fazendo grep 'an' OR ''. O ''sucesso não corresponde a nada em todos os locais da entrada. Somente o ané destacado, porque você não pode destacar o nada. :-)
Mikel
Gênio puro. Não funcionou para mim, mas grep --color -e 'an' -e ' '(combinar um espaço que não pode ser colorido fez o truque). Muito melhor do que ir atrás sed -e ''/an/s//$(printf "\033[33;1m&\033[0m")/'', mas talvez o último seja mais eficiente. Altere 'an' para outro termo de pesquisa. ;)
sjas
Uau! Eu usei isso para modificar o comando que usei para listar todos os bashrcapelidos e agora todos os meus apelidos estão destacados em vermelho. Super! alias aliases="clear;cat ~/.bashrc|grep --color \"alias\""
Nav
9

O ack tem uma --passthruopção que fará isso:

ack --passthru an test.txt
some_command | ack --passthru an -
cjm
fonte
2
(+1) btw: no repo Ubuntu, o pacote (e executável) é chamado ack-grep... (o nome acké aplicado a um conversor de código Kanji)
Peter.O
2

Você pode experimentar esse meu script. Isso permitirá que você especifique um arquivo ou obtenha uma entrada padrão. Você pode definir uma expressão regular do Python para o texto que deseja destacar. os padrões de texto destacados são verde neon (ei, eu uso um fundo preto!) Mas você pode alterar o código de cor 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)

Aqui está um exemplo.

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

Perspectivas para uma retirada ordenada NATO de AFG um ist um sofreu dois contratempos como presidente Hamid Karzai dem um limite ded sobre tropas dos Estados Unidos um d o Talib um suspendeu as negociações de paz.

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

As perspectivas de uma retirada ordenada da OTAN do Afeganistão sofreram dois reveses, já que o presidente Hamid Karzai exigiu limites às tropas dos Estados Unidos e o Taliban interrompeu as negociações de paz.

fthinker
fonte
A marcação em negrito stackexchange parece descolada e é por isso que a saída tem estrelas extras. me bate.
Fthinker 16/03/12
Use <b>se você precisar colocar em negrito parte de uma palavra.
Cjm
0

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

"cor" também funciona. Você também pode definir um alias para fazer o grep sempre usar a opção:

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

Coloque o acima em /etc/profile.d/ em algum lugar ou no seu .bashrc ou o que for.

gerdesj
fonte
1
Isso apenas imprime linhas correspondentes. Frank quer o texto inteiro, apenas com as correspondências destacadas.
Cjm 15/03/12
Adicionado um -C ao acima - ele funciona, mas é um pouco bagunçado!
gerdesj
3
Funciona, mas você não deve criar um alias chamado grep. Com -C 1000000você nunca será capaz de cumprimentar novamente. Basta fazer alias highlight='grep --colour=auto -C 1000000'. The cat in the first example is also not necessary: grep --colour = auto -C 100000 file`.
Matteo
Gostaria de saber quanta memória será consumida em um arquivo grande. (Eu nunca olhei em como greplida com a coleção de linhas de contexto.)
CJM