คำสั่งที่เน้น regex ในข้อความหรือไม่


14

มีคำสั่งที่เน้นการแสดงออกในข้อความหรือไม่?

ฉันกำลังมองหาบางอย่างเช่นฟังก์ชั่น 'ค้นหา' น้อยกว่า แต่มีเอาต์พุตข้อความปกติบน stdout แทนที่จะเป็นlessวิวเวอร์

ตัวอย่าง:

$ cat test.txt | highlight "an"

อนาคตสำหรับถอนนาโตเป็นระเบียบจาก Afgh ist รับความเดือดร้อนสองความพ่ายแพ้เป็นประธานาธิบดีฮามิดคาร์ไซ DEM ขีด จำกัด ded กองกำลังสหรัฐอเมริกางลิบเจรจาสันติภาพหยุด

มันสามารถใช้สีหรือวิธีอื่นใดเพื่อเน้นการแสดงออกปกติที่ระบุ



@Gilles ค่อนข้าง แต่คำถามที่มีความต้องการที่ซับซ้อนมากขึ้น
cjm

คำตอบ:


17

ไม่แน่ใจว่าเป็นเพราะคุณสมบัติหรือผลข้างเคียงบางอย่างที่ซ่อนอยู่ แต่ใช้งานได้ใน GNU grep2.11:

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

10
grep 'an' OR ''มันก็เหมือนกับการที่คุณกำลังทำ การ''จับคู่ไม่สำเร็จในทุกตำแหน่งในอินพุต เฉพาะanไฮไลต์เท่านั้นเนื่องจากคุณไม่สามารถไฮไลต์อะไรเลย :-)
มิเคล

อัจฉริยะบริสุทธิ์ มันไม่ได้ผลสำหรับฉัน แต่grep --color -e 'an' -e ' '(การจับคู่สำหรับช่องว่างซึ่งไม่สามารถทำสีได้) วิธีที่ดีกว่าการใช้ท่อsed -e ''/an/s//$(printf "\033[33;1m&\033[0m")/''แต่อาจเป็นวิธีที่ดีกว่า เปลี่ยน 'an' สำหรับคำค้นหาอื่น ;)
sjas

ว้าว! ฉันใช้สิ่งนี้เพื่อแก้ไขคำสั่งที่ฉันใช้เพื่อแสดงรายการbashrcชื่อแทนทั้งหมดและตอนนี้ชื่อแทนของฉันทั้งหมดจะถูกเน้นด้วยสีแดง Super! alias aliases="clear;cat ~/.bashrc|grep --color \"alias\""
Nav

9

แอ๊มี--passthruตัวเลือกที่จะทำสิ่งนี้:

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

2
(+1) btw: ใน Ubuntu repo แพคเกจ (และปฏิบัติการ) เรียกว่าack-grep... (ชื่อackนี้ใช้กับตัวแปลงรหัส Kanji)
Peter.O

2

คุณสามารถลองใช้สคริปต์ของฉันนี้ มันจะช่วยให้คุณระบุไฟล์หรือใช้อินพุตมาตรฐาน คุณสามารถกำหนดนิพจน์ทั่วไป Python สำหรับข้อความที่คุณต้องการไฮไลต์ ค่าเริ่มต้นของข้อความที่ไฮไลต์เป็นสีเขียวนีออน (เฮ้ฉันใช้พื้นหลังสีดำ!) แต่คุณสามารถเปลี่ยนรหัสสี 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)

นี่คือตัวอย่างเช่น

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

อนาคตสำหรับถอนนาโตเป็นระเบียบจาก Afgh ist รับความเดือดร้อนสองความพ่ายแพ้เป็นประธานาธิบดีฮามิดคาร์ไซ DEM ขีด จำกัด ded กองกำลังสหรัฐอเมริกางลิบเจรจาสันติภาพหยุด

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

อนาคตสำหรับการถอนตัวจากนาโตอย่างเป็นระเบียบจากอัฟกานิสถานได้รับความเดือดร้อนสองประการเนื่องจากประธานาธิบดีฮามิดคาร์ไซเรียกร้องข้อ จำกัด ในกองทหารสหรัฐฯและกลุ่มตอลิบานหยุดการเจรจาสันติภาพ


stackexchange ตัวหนามาร์กอัปดูเหมือนขี้ขลาดและนั่นเป็นเหตุผลว่าทำไมการส่งออกจึงมีดาวพิเศษ ชนะฉัน
fthinker

ใช้<b>ถ้าคุณต้องการให้ส่วนของคำเป็นตัวหนา
cjm

0

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

"สี" ยังใช้งานได้ คุณยังสามารถกำหนดนามแฝงเพื่อให้ grep ใช้ตัวเลือกได้เสมอ:

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

ใส่ด้านบนใน /etc/profile.d/ ที่ใดที่หนึ่งหรือ. bashrc ของคุณหรืออะไรก็ตาม


1
พิมพ์เฉพาะเส้นที่ตรงกันเท่านั้น Frank ต้องการข้อความทั้งหมดเพียงเน้นการแข่งขัน
cjm

เพิ่ม -C ไปด้านบน - มันใช้งานได้ แต่ยุ่งเล็กน้อย!
gerdesj

3
มันใช้งานได้ แต่คุณไม่ควรสร้างนามแฝงที่เรียกว่า grep ด้วย-C 1000000คุณจะไม่สามารถ grep อีกครั้ง เพียงทำalias highlight='grep --colour=auto -C 1000000'. The cat in the first example is also not necessary: grep --colour = auto -C 100000 file`
Matteo

ฉันสงสัยว่าหน่วยความจำที่ใช้ไปกับไฟล์ขนาดใหญ่เท่าไร (ฉันไม่เคยตรวจสอบวิธีgrepจัดการกับคอลเลกชันของบรรทัดบริบท)
cjm
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.