Metinde normal ifadeyi vurgulayan komut?


14

Metinde belirli bir ifadeyi vurgulayan bir komut var mı?

Ben daha az 'arama' fonksiyonu gibi bir şey arıyorum, ama stdout normal lessgörüntüleyici yerine, görüntüleyici yerine .

Misal:

$ cat test.txt | highlight "an"

Umutları bir Afgh gelen düzenli NATO çekilme bir ist bir Devlet Başkanı Hamid Karzai olarak uğradığı iki gerilemeler demlenmeye bir ABD askerlerine ded sınırlarını bir Talib d bir barış görüşmelerini durdurdu.

Belirtilen normal ifadeyi vurgulamak için renk veya başka herhangi bir yöntem kullanabilir.



@Gilles, bir şekilde, ama bu sorunun çok daha karmaşık gereksinimleri vardı.
cjm

Yanıtlar:


17

Bunun bir özellikten mi yoksa sadece gizli bir yan etkiden mi kaynaklandığından emin değilim, ancak GNU grep2.11'de çalışıyor :

grep --color 'an\|' test.txt

10
Sanki yapıyorsun grep 'an' OR ''. ''Başarıyla giriş her yerde hiçbir şey ile eşleşir. Sadece anvurgulanır, çünkü hiçbir şeyi vurgulayamazsınız. :-)
Mikel

Saf deha. Benim için işe yaramadı, ama grep --color -e 'an' -e ' '(renklendirilemeyen bir alanla eşleşen hile yaptı). Borulardan daha iyi sed -e ''/an/s//$(printf "\033[33;1m&\033[0m")/'', ama belki de daha performanslıdır. Başka bir arama terimi için 'an' değerini değiştirin. ;)
sjas

Vaov! Bunu bashrc, tüm diğer adları listelemek için kullandığım komutu değiştirmek için kullandım ve şimdi tüm diğer adlarım kırmızı renkle vurgulanıyor. Süper! alias aliases="clear;cat ~/.bashrc|grep --color \"alias\""
Nav

9

ack--passthru bunu yapacak bir seçeneğe sahiptir:

ack --passthru an test.txt
some_command | ack --passthru an -

2
(+1) btw: Ubuntu deposunda, pakete (ve yürütülebilir) çağrılır ack-grep... (ad ackbir Kanji kod dönüştürücüsüne uygulanır)
Peter.O

2

Bu senaryomu deneyebilirsin. Bir dosya belirtmenize izin verir veya standart girdi alır. Vurgulamak istediğiniz metin için bir Python normal ifadesi tanımlayabilirsiniz. Vurgulanan metin varsayılan olarak neon yeşildir (hey siyah bir arka plan kullanıyorum!) Ancak ANSI renk kodunu değiştirebilirsiniz .

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

İşte bir örnek.

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

Umutları bir Afgh gelen düzenli NATO çekilme bir ist bir Devlet Başkanı Hamid Karzai olarak uğradığı iki gerilemeler demlenmeye bir ABD askerlerine ded sınırlarını bir Talib d bir barış görüşmelerini durdurdu.

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

NATO'nun Afganistan'dan düzenli bir şekilde çekilmesi beklentileri , Cumhurbaşkanı Hamid Karzai'nin ABD birliklerine sınırlar getirmesi ve Taliban barış görüşmelerini durdurması nedeniyle iki aksilik yaşadı.


stackexchange kalın biçimlendirmesi korkak görünüyor ve bu yüzden çıktının ekstra yıldızları var. beni aşar.
fthinker

<b>Bir kelimenin bir kısmını kalınlaştırmanız gerekiyorsa kullanın .
cjm

0

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

"renk" de çalışır. Ayrıca grep'in her zaman seçeneği kullanmasını sağlamak için bir takma ad da tanımlayabilirsiniz:

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

Yukarıdakileri /etc/profile.d/ dosyasına bir yere veya .bashrc'nize veya başka bir yere koyun.


1
Yalnızca eşleşen satırları yazdırır. Frank tüm metni istiyor, sadece maçlar vurgulanıyor.
cjm

Yukarıdakilere bir -C eklendi - çalışıyor ama biraz dağınık!
gerdesj

3
O inşaat ama gerektiği değil grep denilen bir takma ad oluşturun. Bir -C 1000000daha asla grep yapamazsın. Sadece alias highlight='grep --colour=auto -C 1000000'. The cat in the first example is also not necessary: grep --colour = auto -C 100000 dosyası` yapın.
Matteo

Büyük bir dosyada ne kadar bellek harcayacağını merak ediyorum. (Hiçbir zaman grepbağlam çizgilerinin toplanmasını nasıl ele
aldığına bakmadım
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.