Lệnh nào nổi bật regex trong văn bản?


14

Có một lệnh làm nổi bật một biểu thức nhất định trong văn bản?

Tôi đang tìm kiếm một cái gì đó giống như chức năng 'tìm kiếm' trong ít hơn, nhưng với đầu ra văn bản bình thường trên thiết bị xuất chuẩn, thay vì lesstrình xem.

Thí dụ:

$ cat test.txt | highlight "an"

Triển vọng cho một rút NATO có trật tự từ Afgh một ist một bị hai thất bại như Tổng thống Hamid Karzai dem một giới hạn ded vào quân đội Hoa Kỳ một d các Talib một dừng cuộc đàm phán hòa bình.

Nó có thể sử dụng màu sắc hoặc bất kỳ phương tiện nào khác để làm nổi bật biểu thức chính quy định.



@Gilles, phần nào, nhưng câu hỏi đó có yêu cầu phức tạp hơn nhiều.
cjm

Câu trả lời:


17

Không chắc đây là do một tính năng hay chỉ là một số tác dụng phụ bị ẩn, nhưng điều này hoạt động trong GNU grep2.11:

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

10
Nó giống như bạn đang làm grep 'an' OR ''. Kết ''hợp thành công không có gì ở mọi vị trí trong đầu vào. Chỉ cái anđược tô sáng, bởi vì bạn không thể làm nổi bật cái gì cả. :-)
Mikel

Thiên tài thuần túy. Nó không hoạt động đối với tôi, nhưng grep --color -e 'an' -e ' '(phù hợp với một không gian, không thể tô màu đã tạo ra mánh khóe). Cách tốt hơn so với đường ống đến sed -e ''/an/s//$(printf "\033[33;1m&\033[0m")/'', nhưng có lẽ sau này là hiệu suất cao hơn. Thay đổi 'an' cho cụm từ tìm kiếm khác. ;)
sjas

Ồ Tôi đã sử dụng điều này để sửa đổi lệnh tôi đã sử dụng để liệt kê tất cả các bashrcbí danh và bây giờ tất cả các bí danh của tôi được tô sáng màu đỏ. Siêu! alias aliases="clear;cat ~/.bashrc|grep --color \"alias\""
Nav

9

ack có một --passthrutùy chọn sẽ làm điều này:

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

2
(+1) btw: trong repo Ubuntu, gói (và có thể thực thi) được gọi là ack-grep... (tên ackđược áp dụng cho trình chuyển đổi mã Kanji)
Peter.O

2

Bạn có thể thử kịch bản này của tôi. Nó sẽ cho phép bạn chỉ định một tệp hoặc nó có đầu vào tiêu chuẩn. Bạn có thể định nghĩa biểu thức chính quy Python cho văn bản bạn muốn tô sáng. văn bản được tô sáng mặc định thành màu xanh neon (hey tôi sử dụng nền đen!) Nhưng bạn có thể thay đổi mã màu 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)

Đây là một ví dụ.

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

Triển vọng cho một rút NATO có trật tự từ Afgh một ist một bị hai thất bại như Tổng thống Hamid Karzai dem một giới hạn ded vào quân đội Hoa Kỳ một d các Talib một dừng cuộc đàm phán hòa bình.

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

Triển vọng cho một cuộc rút quân có trật tự của NATO khỏi Afghanistan phải chịu hai thất bại khi Tổng thống Hamid Karzai yêu cầu giới hạn đối với quân đội Hoa Kỳ và Taliban tạm dừng các cuộc đàm phán hòa bình.


stackexchange đánh dấu đậm có vẻ sôi nổi và đó là lý do tại sao đầu ra có thêm sao. đánh bại tôi
fthinker

Sử dụng <b>nếu bạn cần in đậm một phần của một từ.
cjm

0

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

"màu" cũng hoạt động. Bạn cũng có thể xác định bí danh để làm cho grep luôn sử dụng tùy chọn:

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

Đặt phần trên vào /etc/profile.d/ ở đâu đó hoặc .bashrc của bạn hoặc bất cứ điều gì.


1
Điều đó chỉ in các dòng phù hợp. Frank muốn toàn bộ văn bản, chỉ với các trận đấu được tô sáng.
cjm

Đã thêm một -C vào ở trên - nó hoạt động nhưng hơi lộn xộn!
gerdesj

3
Nó hoạt động nhưng bạn nên không tạo một bí danh gọi là grep. Với -C 1000000bạn không bao giờ có thể grep một lần nữa. Chỉ cần làm alias highlight='grep --colour=auto -C 1000000'. The cat in the first example is also not necessary: grep --colour = auto -C 100000 tệp`.
Matteo

Tôi tự hỏi bao nhiêu bộ nhớ sẽ tiêu thụ trên một tệp lớn. (Tôi chưa bao giờ xem xét cách grepxử lý bộ sưu tập các dòng ngữ cảnh.)
cjm
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.