एक मैच के आसपास के पात्रों grep


8

मैं एक विशाल डेटाबेस डंप के भीतर एक खोजने और बदलने के लिए देख रहा हूं, और यह वह नहीं कर रहा है जो मुझे लगता है कि होना चाहिए। मैं फ़ाइल में अपने लक्ष्य स्ट्रिंग के लिए grep करना चाहता हूं, और फिर आसपास के 8 वर्ण या तो देखें (मुझे उस संख्या को समायोजित करने की आवश्यकता हो सकती है, निर्भर करता है)। मैं उसे कैसे कर सकता हूँ?

इसका कारण यह नहीं है कि मैं हजारों मैच नहीं कर सकता, क्योंकि कई सैकड़ों हैं। मैं स्ट्रिंग के आस-पास कुछ वर्ण प्राप्त करना चाहता हूं, और फिर इसे पाइप में uniqया यह देखने के लिए कि मेरे ढूंढने और बदलने के लिए अप्रत्याशित व्यवहार क्यों है।

इसके अलावा, एक ही लाइन पर कई मैच हो सकते हैं!


यह एक पाठ फ़ाइल नहीं है?
20

यह है, लेकिन यहां तक ​​कि सिर्फ मैच भी नेत्रगोलक के लिए एक बड़ी फ़ाइल है।
user394

जवाबों:


12

कच्चे रास्ते का उपयोग grepकुछ इस तरह होगा

grep -o "....yourtext...." /path/to/the/dump.sql

डॉट्स की संख्या ग्रिप किए गए पाठ से पहले / बाद में वर्णों की संख्या से मेल खाती है। -oविकल्प बनाता है grepउत्पादन केवल मैचों, न कि पूरी लाइनों।

uniqआउटपुट पर उपयोग करने के लिए , याद रखें कि आपको पहले आउटपुट को सॉर्ट करना होगा। तो आमतौर पर, आप करते हैं

grep . . . | sort | uniq

यदि आप प्रत्येक मैच के लिए हिटकाउंट में रुचि रखते हैं, तो आप उपयोग करके अच्छा आउटपुट प्राप्त कर सकते हैं

grep . . . | sort | uniq -c | sort -n

क्रूड? पूरी तरह से परिष्कृत!
user394

1
आप दोहराए गए ऑपरेटर का उपयोग करके इस पर थोड़ा विस्तार कर सकते हैं grep -o '.\{8\}yourtext.\{8\}':। यह 8 डॉट्स की गिनती की तुलना में थोड़ा कम चक्कर है।
कालेब

:) क्रूड से मेरा मतलब है कि आप मैच्योर कैरेक्टर्स (रेंज का इस्तेमाल करके) या कैरेक्टर सेट को कम करने जैसी चीजों से नहीं खेलते हैं।
रोज़्ज़ेट्रिजेविज़

@ कालेब और उपयोगकर्ता 394: यह ठीक वही है जो मैंने सुझाव नहीं दिया (और इस प्रकार मेरी विधि "क्रूड" कहलाती है)। एक को दोहराने वाले ऑपरेटर निर्माण को याद रखने की आवश्यकता नहीं है, इसके अलावा - यह "....." से टाइप करने के लिए और भी तेज़ है। \ {6 \} "।
rozcietrzewiacz 20

7

@Rozcietrzewiacz के जवाब से शुरू, मैं विस्तार कर सकता हूं

pattern="string"
num=8
grep -on ".\{0,$num\}$pattern.\{0,$num\}" input-file

1
"क्रूड" डॉट सीक्वेंस हर समय बेहतर और बेहतर दिख रहा है :)
कालेब

1
@ कालेब: आम तौर पर "क्रूड" जवाब एक अच्छी शुरुआत है, लेकिन कभी-कभी कोई इस पर थोड़ा विस्तार करना चाहता है।
enzotib

1
डॉट अनुक्रम विधि बाएँ या दाएँ उचित लक्ष्य पैटर्न नहीं मिलेगा; यह तरीका होगा। (+1)
पीटर। 12

2
पुनश्च .. मैंने अभी देखा कि यह उसी लाइन पर पैटर्न के उदाहरणों को नहीं पकड़ता है (जैसा कि ओपी ने उल्लेख किया है) जब पहले पैटर्न के 'एक्सटा' पाठ के अनुगामी का दायरा अग्रणी 'अतिरिक्त' पाठ के दायरे को ओवरलैप करता है। अगले पैटर्न
पीटर।

@ पसंदीदा: हाँ, -oदो मैचों में ओवरलैप होने पर केवल पहला मैच देता है:echo 'aaabbbccc' | grep -o 'bb
enzotib
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.