2012-09-29 10 views
52

grep में नई लाइन के लिए पैटर्न कैसे देना है? शुरुआत में नई लाइन, अंत में नई लाइन। नियमित अभिव्यक्ति तरीका नहीं है। कुछ \ n।grep में नई लाइन के लिए पैटर्न कैसे दें?

+6

यह स्पष्ट नहीं है कि आप क्या चाहते। 'शुरुआत में नई लाइन' एक खाली रेखा है और फ़ाइल में प्रत्येक पंक्ति पर 'अंत में' नई पंक्ति लागू होती है। क्या आप एक उदाहरण पोस्ट कर सकते हैं? –

+0

वास्तव में आप केवल '$' का उपयोग कर सकते हैं। यह कुछ हद तक सीमित है, लेकिन सरल मामलों में प्रयोग योग्य है। –

+0

https://www.gnu.org/software/grep/manual/grep.html#Usage आइटम देखें 15. – jarno

उत्तर

54

grep पैटर्न व्यक्तिगत लाइनों के खिलाफ मेल खाते हैं इसलिए इनपुट में मिली नई लाइन से मेल खाने के लिए पैटर्न का कोई तरीका नहीं है।

लेकिन अगर आप इस तरह खाली लाइनों पा सकते हैं:

grep '^$' file 
grep '^[[:space:]]*$' file # include white spaces 
+0

कम से कम जीएनयू grep के पास -z विकल्प है जो शून्य चरित्र द्वारा grep ब्रेक लाइन बनाता है। हालांकि, यह न्यूलाइन से मेल खाने के लिए पैटर्न में नई लाइन या \ n का समर्थन नहीं करता है, [बग रिपोर्ट] देखें (https://bugs.launchpad.net/ubuntu/+source/grep/+bug/1641092)। – jarno

+0

@jarno यह -P ध्वज – rubystallion

10

आप इस तरह से उपयोग कर सकते हैं ...

grep -P '^\s$' file 
  • -P (एक विस्तार POSIX grep करने के लिए पर्ल नियमित अभिव्यक्ति के लिए प्रयोग किया जाता है)।
  • \s सफेद स्पेस वर्णों से मेल खाता है; यदि * के बाद, यह एक खाली रेखा से भी मेल खाता है।
  • ^ लाइन की शुरुआत से मेल खाता है। $ लाइन के अंत से मेल खाता है।
+1

'-P' के साथ पैटर्न में \ n समर्थन करता है एक जीएनयू एक्सटेंशन है।स्थिति का उपयोग करने के लिए मैं ठीक हूं (आमतौर पर लुकहेड/लुकहेइंड), लेकिन POSIX grep यह सिर्फ '[[: space:]]' के साथ फ़ाइल कर सकता है। – jordanm

+1

एफडब्ल्यूआईडब्ल्यू, सोलारिस 'और बीएसडी के जीआरपी मैनपेज (दूसरों की जांच नहीं की गई) दोनों के पास' -पी 'के लिए एक पैराग्राफ है। वैसे भी जीएनयू काफी मानक है। :) –

+0

perl regex के लिए +1 :) – mattexx

59

नियमित grep के बजाय pcregrep कोशिश:

pcregrep -M "pattern1.*\n.*pattern2" filename 

-M विकल्प यह कई पंक्तियों में मैच के लिए अनुमति देता है, तो आप \n के रूप में नई-पंक्तियों के लिए खोज सकते हैं।

+0

बिल्कुल मैं देख रहा था, धन्यवाद! – yorch

3

वैकल्पिक हल के लिए, आप अस्थायी अलग चरित्र के साथ नए-लाइन की जगह है और इसे वापस बदल सकते हैं, जैसे (गैर पोर्टेबल -P का उपयोग किए बिना) के लिए के रूप में:

grep -o "_foo_" <(paste -sd_ file) | tr -d '_' 

कहाँ वह सटीक मिलान _foo_ जहां _ साधन की तलाश में \n (इसलिए __ = \n\n)। आपको इसे tr '_' '\n' द्वारा वापस अनुवाद करने की आवश्यकता नहीं है, क्योंकि प्रत्येक पैटर्न को नई लाइन में मुद्रित किया जाएगा, इसलिए _ को हटा देना पर्याप्त है।

0

धन्यवाद मैं -z विकल्प के बारे में पता करने के लिए @jarno और मुझे पता चला है कि जब -पी विकल्प के साथ जीएनयू ग्रेप का उपयोग कर, \n के खिलाफ मिलान संभव है। :)

उदाहरण:

grep -zoP 'foo\n\K.*'<<<$'foo\nbar'

प्रिंटों bar

संबंधित मुद्दे