Polecenie, które wyróżnia wyrażenie regularne w tekście?

14

Czy istnieje polecenie podkreślające określone wyrażenie w tekście?

Szukam czegoś takiego jak funkcja „wyszukiwania” w mniejszym stopniu, ale z normalnym wyjściem tekstu na standardowym ekranie zamiast w lessprzeglądarce.

Przykład:

$ cat test.txt | highlight "an"

Perspektywy w uporządkowany odstąpienia NATO od Afgh ist an ponieśli dwie porażki jako prezydenta Hamida Karzaja dem an DED granice amerykańskich wojsk D Talib zatrzymał rozmów pokojowych.

Może użyć koloru lub innych środków do podkreślenia określonego wyrażenia regularnego.

Szczery
źródło
1
możliwy duplikat highlightdowodzenia
Gilles „SO- przestań być zły”
@Gilles, nieco, ale to pytanie miało znacznie bardziej złożone wymagania.
cjm

Odpowiedzi:

17

Nie jestem pewien, czy wynika to z funkcji, czy z jakiegoś ukrytego efektu ubocznego, ale działa to w GNU grep2.11:

grep --color 'an\|' test.txt
człowiek w pracy
źródło
10
To jak robisz grep 'an' OR ''. ''Powodzeniem pasuje do niczego w każdym miejscu na wejściu. anPodświetlone jest tylko , ponieważ nie można podświetlić niczego. :-)
Mikel
Czysty geniusz. Nie działało to dla mnie, ale grep --color -e 'an' -e ' '(pasowanie do miejsca, którego nie można pokolorować, załatwiło sprawę). O wiele lepsze niż orurowanie sed -e ''/an/s//$(printf "\033[33;1m&\033[0m")/'', ale może ten drugi jest bardziej wydajny. Zmień „an” dla innego wyszukiwanego hasła. ;)
sjas
Łał! Użyłem tego, aby zmodyfikować polecenie, którego użyłem, aby wyświetlić listę wszystkich bashrcaliasów, a teraz wszystkie moje aliasy są podświetlone na czerwono. Wspaniały! alias aliases="clear;cat ~/.bashrc|grep --color \"alias\""
Nav
9

ack ma --passthruopcję, która to zrobi:

ack --passthru an test.txt
some_command | ack --passthru an -
cjm
źródło
2
(+1) btw: w repozytorium Ubuntu pakiet (i plik wykonywalny) nazywa się ack-grep... (nazwa ackjest stosowana do konwertera kodu Kanji)
Peter.O
2

Możesz wypróbować mój skrypt. Pozwoli ci albo określić plik, albo pobierze standardowe dane wejściowe. Możesz zdefiniować wyrażenie regularne Pythona dla tekstu, który chcesz wyróżnić. podświetlony tekst domyślnie ma kolor zielony neon (hej, używam czarnego tła!) Ale możesz zmienić kod koloru 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)

Oto przykładem.

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

Perspektywy w uporządkowany odstąpienia NATO od Afgh ist an ponieśli dwie porażki jako prezydent Hamid Karzaj dem an DED granice amerykańskich wojsk D Talib zatrzymał rozmów pokojowych.

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

Perspektywy uporządkowanego wycofania się NATO z Afganistanu doznały dwóch niepowodzeń, gdy prezydent Hamid Karzaj zażądał ograniczenia wojsk Stanów Zjednoczonych, a talibowie wstrzymali rozmowy pokojowe.

myśliciel
źródło
pogrubione znaczniki stackexchange wydają się funky i dlatego na wyjściu są dodatkowe gwiazdki. bije mnie.
myśliciel
Użyj, <b>jeśli chcesz pogrubić część słowa.
cjm
0

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

„kolor” również działa. Możesz także zdefiniować alias, aby grep zawsze używał opcji:

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

Umieść powyższe w /etc/profile.d/ gdzieś lub w .bashrc lub czymkolwiek.

gerdesj
źródło
1
To drukuje tylko pasujące linie. Frank chce cały tekst, tylko z zaznaczonymi dopasowaniami.
cjm
Dodano -C do powyższego - działa, ale jest trochę niechlujne!
gerdesj
3
To działa, ale powinien nie utworzyć alias o nazwie grep. Z -C 1000000tobą już nigdy nie będziesz w stanie grepować. Po prostu zrób alias highlight='grep --colour=auto -C 1000000'. The cat in the first example is also not necessary: grep --colour = auto-C 100000 plik`.
Matteo,
Zastanawiam się, ile pamięci zajmie duży plik. (Nigdy nie zastanawiałem się, jak grepradzi sobie z kolekcją linii kontekstu.)
cjm