Perintah yang menyoroti regex dalam teks?

14

Apakah ada perintah yang menyoroti ekspresi tertentu dalam teks?

Saya mencari sesuatu seperti fungsi 'pencarian' dalam waktu kurang, tetapi dengan output teks normal pada stdout, bukan lesspenampil.

Contoh:

$ cat test.txt | highlight "an"

Prospek untuk sebuah penarikan NATO teratur dari Afgh sebuah ist sebuah menderita dua kemunduran sebagai Presiden Hamid Karzai dem sebuah batas ded terhadap pasukan Amerika Serikat yang d Thalib sebuah dihentikan pembicaraan damai.

Itu bisa menggunakan warna atau cara lain untuk menyorot ekspresi reguler yang ditentukan.

jujur
sumber
1
kemungkinan duplikat highlightperintah
Gilles 'SO- stop being evil'
@Gilles, agak, tapi pertanyaan itu memiliki persyaratan yang jauh lebih kompleks.
cjm

Jawaban:

17

Tidak yakin apakah ini karena fitur atau hanya beberapa efek samping tersembunyi, tetapi ini berfungsi di GNU grep2.11:

grep --color 'an\|' test.txt
manatwork
sumber
10
Seperti yang Anda lakukan grep 'an' OR ''. The ''berhasil pertandingan tidak ada di setiap lokasi di input. Hanya yang andisorot, karena Anda tidak dapat menyorot apa pun. :-)
Mikel
Jenius murni. Itu tidak bekerja untuk saya, tetapi grep --color -e 'an' -e ' '(cocok untuk ruang, yang tidak dapat diwarnai melakukan trik). Jauh lebih baik daripada perpipaan sed -e ''/an/s//$(printf "\033[33;1m&\033[0m")/'', tapi mungkin yang terakhir lebih performan. Ubah 'an' untuk istilah pencarian lain. ;)
sjas
Wow! Saya menggunakan ini untuk memodifikasi perintah yang saya gunakan untuk membuat daftar semua bashrcalias, dan sekarang semua alias saya disorot dengan warna merah. Super! alias aliases="clear;cat ~/.bashrc|grep --color \"alias\""
Nav
9

ack memiliki --passthruopsi yang akan melakukan ini:

ack --passthru an test.txt
some_command | ack --passthru an -
cjm
sumber
2
(+1) btw: dalam repo Ubuntu, paket (dan yang dapat dieksekusi) disebut ack-grep... (nama acktersebut diterapkan pada konverter kode Kanji)
Peter.O
2

Anda dapat mencoba skrip saya ini. Ini akan membiarkan Anda menentukan file atau mengambil input standar. Anda bisa mendefinisikan ekspresi reguler Python untuk teks yang ingin Anda sorot. default teks yang disorot menjadi hijau neon (hei saya menggunakan latar belakang hitam!) Tapi Anda dapat mengubah kode warna 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)

Ini sebuah contoh.

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

Prospek untuk sebuah penarikan NATO teratur dari Afgh sebuah ist sebuah menderita dua kemunduran sebagai Presiden Hamid Karzai dem sebuah batas ded terhadap pasukan Amerika Serikat yang d Thalib sebuah dihentikan pembicaraan damai.

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

Prospek untuk penarikan NATO secara teratur dari Afghanistan mengalami dua kemunduran karena Presiden Hamid Karzai menuntut batasan pasukan Amerika Serikat dan Taliban menghentikan pembicaraan damai.

fthinker
sumber
stackexchange markup tebal tampaknya funky dan itulah sebabnya output memiliki bintang tambahan. mengalahkan saya.
fthinker
Gunakan <b>jika Anda perlu menebalkan bagian kata.
cjm
0

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

"warna" juga berfungsi. Anda juga dapat menetapkan alias untuk membuat grep selalu menggunakan opsi:

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

Letakkan di atas di /etc/profile.d/ di suatu tempat atau .bashrc Anda atau apa pun.

gerdesj
sumber
1
Itu hanya mencetak garis yang cocok. Frank ingin seluruh teks, hanya dengan pertandingan yang disorot.
cjm
Menambahkan -C ke atas - itu berfungsi tetapi agak berantakan!
gerdesj
3
Ini berfungsi tetapi Anda seharusnya tidak membuat alias bernama grep. Dengan -C 1000000Anda tidak akan pernah bisa grep lagi. Lakukan saja alias highlight='grep --colour=auto -C 1000000'. The cat in the first example is also not necessary: grep --colour = auto -C 100000 file`.
Matteo
Saya bertanya-tanya berapa banyak memori yang akan dikonsumsi pada file besar. (Saya tidak pernah melihat bagaimana grepmenangani koleksi garis konteks.)
cjm