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.



@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

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 -

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.


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.


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.