ग्रीप मल्टीलाइन पैटर्न


13

मैं कई पंक्तियों पर एक वाक्यांश कैसे खोज सकता हूं? उदाहरण के लिए "मेरी बर्फ की चाय" वाक्यांश है तो इसे पाठ फ़ाइलों में लपेटा जा सकता है:

as js skdfh dfh djh sf my
ice tea.

बीच में एक नई लाइन आने से grep मेल नहीं खाएगा। मैं उन से कैसे मेल करूँ? एक और मल्टीलाइन पैटर्न होगाpattern1_\n_pattern2

मुझे पता है कि सबसे आसान तरीका यह है कि मैं एटीएम को एक हिस्से के लिए सिर्फ grep करता हूं, जैसे कि -A2 -B2 ध्वज के साथ बर्फ और फिर उस तरह जैसे चाय के लिए उत्पादन में। लेकिन यह बहुत थकाऊ है। इसलिए मैं इस पर इंटरसेस्ट हूं कि आप इसे कैसे हल करेंगे।


1
की संभावित क्रॉस साइट डुप्लिकेट: stackoverflow.com/questions/152708/…
Ciro Santilli 中心:::

जवाबों:


16

आप स्थापित कर सकते हैं pcregrep(अधिकांश डिस्ट्रो रिपॉजिटरी में उपलब्ध) - जो कि पीसीआर लाइब्रेरी का उपयोग करके grep है , जो "पर्ल कम्पेटिबल रेगुलर एक्सप्रेशंस" करता है। इसके पास एक कमांड लाइन विकल्प है -Mजो आपको बहु-स्तरीय खोज करने की अनुमति देता है - मैन पेज से :

"किसी भी एक मैच के लिए आउटपुट में एक से अधिक लाइन शामिल हो सकती हैं।"

तो आप कर सकते हैं

pcregrep -M 'my\s+ice\s+tea' filename

\sखाली स्थान के है, जो से मेल खाएगी है \nऔर \rबहु मोड में, सामान्य खाली स्थान के पात्रों के अलावा। आप न्यूलाइन कैरेक्टर को सीधे मेल भी कर सकते हैं, इसलिए आप कर सकते हैं

pcregrep -M 'pattern1_\n_pattern2' filename

+1 अच्छा। इसके बारे में कभी नहीं सुना, लेकिन यह कोशिश की और यह एक आकर्षण की तरह काम करता है!
डेवपैरिलो

grep -Eपीसीआर पैटर्न नहीं करता है ?
डेनिथ

3
@Daenyth ग्रेप -E ज्यादातर केवल आपके उपयोग कर सकते हैं इसका मतलब है ?, +, {, |, (, और )एक के लिए बिना अपने सामान्य regex अर्थ के रूप में \ सामने, जैसा कि आप अगर आप मानक ग्रेप का उपयोग करते हैं। तो grep 'hello\s\+world' fileके बराबर है grep -E 'hello\s+world' file। यह पीसीआरई नहीं करता है। नहीं है grep -Pपर्ल नियमित अभिव्यक्ति के लिए, लेकिन यह प्रायोगिक है (आदमी पेज के अनुसार) और मुझे लगता है कि यह pcregrep से थोड़ा अलग है ...
हामिश डाउनर

1
हाँ, मैं सोच रहा था -Pजब मैंने कहा था -E, लेकिन मुझे एहसास नहीं था कि यह अलग था।
डेनेथ

3

मैं शायद एक खोज का उपयोग करना होगा vimकी :vimgrepकमान। यह एक तरह से अस्पष्ट तरीके से काम करता है, grepलेकिन विम आरईएस और रास्तों का समर्थन करता है।

मूल रूप से आप :vimgrep 'pattern1\npattern2' path/**एक पुनरावर्ती खोज के लिए कुछ पसंद करते हैं, फिर :copenमैचों की सूची वाली एक छोटी खिड़की को लाने के लिए टाइप करें।

vimआरईएस ज्यादातर वह सब कुछ कर सकते हैं जो पीसीआरई कर सकते हैं, लेकिन वे पर्ल रेगुलर एक्सप्रेशन वंश से अलग से विकसित हुए हैं, इसलिए अधिकांश उन्नत सामान अलग तरीके से काम करते हैं। उनकी बुनियादी कार्यक्षमता बुनियादी आरईएस की तरह अधिक है, लेकिन उनके पास कुछ निफ्टी जोड़ हैं जो पीसीआरई की पेशकश नहीं करते हैं।

मुझे यकीन नहीं है कि क्या :vimgrepडेटा को थूकना संभव है जैसा कि grepकरता है; मैंने केवल इसे नेविगेशन के लिए उपयोग करने का प्रयास किया है vim

:help vimgrepvimअधिक जानकारी के लिए भीतर से ; आरईएस :help pattern.txtपर जानकारी के लिए vim; रास्तों के बारे में अधिक जानकारी के लिए देखें :help wildcards


सावधान रहें - यह पूरी तरह से पोर्टेबल नहीं है क्योंकि यह अलग-अलग प्लेटफार्मों पर अलग-अलग व्यवहार करेगा
डैनिएथ

1
@ डायनेथ: क्या आप अलग-अलग के प्रभाव में हैं .vimrc? यह grepऑपरेटिंग सिस्टम के संबंध में अधिक पोर्टेबल होना चाहिए : vimइसमें "POSIX स्वाद" नहीं है, और विंडोज के तहत कम या ज्यादा पहचान के साथ काम करता है। .................................................. ........................... यह सुनिश्चित करने के लिए क्वालीफायर जोड़ना संभव है कि "जादू" की सही मात्रा आरई पर उपयोग की जाती है, हालांकि जैसा कि मैं समझता हूं कि उस विकल्प को अकेले छोड़ने के लिए एक सख्त अलिखित नियम है।
intuited

मैंने स्वयं इसका उपयोग नहीं किया है, लेकिन अप्रत्यक्ष रूप से यह विंडोज़ ( find.exeइसके बजाय grep) पर एक अलग बैकेंड का उपयोग करता है । पिछले कुछ हफ्तों के भीतर एक और सवाल आया था जिसमें यह मुद्दा था।
डेन्थ

1
@ डेंथ: क्या आप सोच रहे हैं :vimgrepया :grep? से :help grep: "आंतरिक grep [अर्थात :vimgrep] का लाभ यह है कि यह सभी प्रणालियों पर काम करता है और शक्तिशाली Vim खोज पैटर्न का उपयोग करता है।"
intuited

1
अरे, यह वह होना चाहिए। मैं दोनों में उलझ गया।
डेनिथ

2

Grep एक समय में केवल एक लाइन पर काम करता है, लेकिन आप पैटर्न की एक श्रृंखला से मेल खाती प्रिंट लाइनों का उपयोग कर सकते हैं:

cat file | awk '/foo/,/bar/'

यह कुछ भी मेल खाता है, न कि दो पैटर्न के बीच की नई भूमिका


0

यूनिक्स से सबसे बाहर निकलने के लिए आपको पाइप का लाभ उठाने की आवश्यकता है। आप इसे सादे grepपाइप (टी की कोई आवश्यकता नहीं) का उपयोग करके कर सकते हैं :

$ grep -A1 "pattern1" file.txt |  grep "pattern2"

जिसे मैं थकाऊ नहीं मानूंगा।


मुझे लगता है कि यह त्रुटि प्रवण है, जैसा कि pattern1 और pattern2 के बीच पैटर्न 3 में मौजूद हो सकता है जो कि आपकी तलाश में नहीं हो सकता है। तो आपको प्रत्येक हिट को मैन्युअल रूप से नियंत्रित करना होगा।
गणित
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.