linux - Grep के समान टेक्स्ट हाइलाइट करें, लेकिन टेक्स्ट को फ़िल्टर न करें




command-line-interface (7)

इस प्रश्न का उत्तर यहां दिया गया है:

Grep का उपयोग करते समय, यह आपकी नियमित अभिव्यक्ति के मिलान के साथ किसी पंक्ति में किसी भी टेक्स्ट को हाइलाइट करेगा।

अगर मैं इस व्यवहार को चाहता हूं, तो क्या होगा, लेकिन grep भी सभी लाइनों को मुद्रित करें? Grep मैन पेज के माध्यम से एक त्वरित रूप से देखने के बाद मैं खाली हो गया।


आप https://github.com/kepkin/dev-shell-essentials से मेरी हाइलाइट स्क्रिप्ट का उपयोग कर सकते हैं

यह grep कारण से बेहतर है क्योंकि आप प्रत्येक मैच को अपने स्वयं के रंग से हाइलाइट कर सकते हैं।

$ command_here | highlight green "input" | highlight red "output"


आप इसे केवल grep का उपयोग करके कर सकते हैं:

  1. रेखा से फ़ाइल लाइन पढ़ना
  2. प्रत्येक पंक्ति में एक पैटर्न से मिलान और grep द्वारा पैटर्न हाइलाइटिंग
  3. यदि कोई मिलान नहीं है, तो लाइन को गूंजें

जो आपको निम्नलिखित देता है:

while read line ; do (echo $line | grep PATTERN) || echo $line  ; done < inputfile

एके का प्रयोग करें। चेकआउट - - --passthru विकल्प यहां: --passthru । इसमें पूर्ण पर्ल नियमित अभिव्यक्तियों को अनुमति देने का अतिरिक्त लाभ है।

$ ack --passthru 'pattern1' file_name

$ command_here | ack --passthru 'pattern1'

आप इसे grep का उपयोग करके भी कर सकते हैं:

$ grep --color -E '^|pattern1|pattern2' file_name

$ command_here | grep --color -E '^|pattern1|pattern2'

यह सभी लाइनों से मेल खाएगा और पैटर्न को हाइलाइट करेगा। ^ लाइन की प्रत्येक शुरुआत से मेल खाता है, लेकिन यह एक चरित्र नहीं होने के बाद मुद्रित / हाइलाइट नहीं किया जाएगा।

(ध्यान दें कि अधिकांश सेटअप डिफ़ॉल्ट रूप से रंग का उपयोग करेंगे। आपको उस ध्वज की आवश्यकता नहीं हो सकती है)।


चूंकि आप हाइलाइट किए गए मैचों को चाहते हैं, यह शायद मानव उपभोग के लिए है (उदाहरण के लिए दूसरे प्रोग्राम में पाइपिंग के विपरीत), इसलिए एक अच्छा समाधान उपयोग करना होगा:

less -p <your-pattern> <your-file>

और यदि आपको केस संवेदनशीलता की परवाह नहीं है:

less -i -p <your-pattern> <your-file>

इसमें पृष्ठों का लाभ भी है, जो लंबे समय तक आउटपुट के दौरान अच्छा होता है


यदि आप ऐसा कर रहे हैं क्योंकि आप अपनी खोज में अधिक संदर्भ चाहते हैं, तो आप यह कर सकते हैं:

cat BIG_FILE.txt | less

less खोज करने से आपके खोज शब्द को हाइलाइट करना चाहिए।

या अपने पसंदीदा संपादक को आउटपुट पाइप करें। एक उदाहरण :

cat BIG_FILE.txt | vim -

फिर खोज / हाइलाइट / प्रतिस्थापित करें।


यदि आप किसी निर्देशिका में एक पैटर्न की पुनरावृत्ति की तलाश में हैं, तो आप इसे पहले फ़ाइल में सहेज सकते हैं।

ls -1R ./ | list-of-files.txt

और फिर grep कि, या grep खोज के लिए इसे पाइप

ls -1R | grep --color -rE '[A-Z]|'

यह सभी फाइलों को सूचीबद्ध करने की तलाश करेगा, लेकिन अपरकेस अक्षरों वाले रंगों को रंग देगा। यदि आप अंतिम हटाते हैं आप केवल मैच देखेंगे।

मैं उदाहरण के लिए ऊपरी मामले के साथ बुरी तरह नामित छवियों को ढूंढने के लिए इसका उपयोग करता हूं, लेकिन सामान्य grep प्रति फ़ाइल केवल एक बार प्रत्येक फ़ाइल के लिए पथ नहीं दिखाता है, इस प्रकार मैं संदर्भ देख सकता हूं।


संपादित करें:

यह ओएस एक्स माउंटेन शेर के grep के साथ काम करता है:

grep --color -E 'pattern1|pattern2|$'

यह '^|pattern1|pattern2' से बेहतर है क्योंकि लाइन के अंत में वैकल्पिक मिलान का हिस्सा भाग के अंत में $ मैचों का मिलान करता है। कुछ नियमित अभिव्यक्ति इंजन pattern1 या pattern2 हाइलाइट नहीं करेंगे क्योंकि ^ पहले से मेल खाता है और इंजन उत्सुक है

'pattern1|pattern2|' लिए कुछ ऐसा ही होता है क्योंकि रेगेक्स इंजन पैटर्न स्ट्रिंग के अंत में खाली विकल्प को नोट करता है विषय स्ट्रिंग की शुरुआत से मेल खाता है।

[1]: http://www.regular-expressions.info/engine.html

पहला संपादन:

मैं perl का उपयोग कर समाप्त हो गया:

perl -pe 's:pattern:\033[31;1m$&\033[30;0m:g'

यह मानता है कि आपके पास एक एएनएसआई-संगत टर्मिनल है।

मूल उत्तर:

यदि आप एक अजीब grep साथ अटक गए हैं, यह काम कर सकता है:

grep -E --color=always -A500 -B500 'pattern1|pattern2' | grep -v '^--'

अपनी इच्छित सभी लाइनों को पाने के लिए संख्याओं को समायोजित करें।

दूसरा grep मैक ओएस एक्स माउंटेन शेर पर बीएसडी-स्टाइल grep द्वारा डाली गई अपर्याप्त लाइनों को हटा देता है, भले ही लगातार मैचों का संदर्भ ओवरलैप हो।

मैंने सोचा कि जीएनयू grep ने लाइनों को छोड़ दिया जब संदर्भ ओवरलैप होता है, लेकिन यह थोड़ी देर हो गया है तो शायद मुझे गलत याद है।






command-line-interface