Grep में नई लाइन के लिए एक पैटर्न कैसे दें?


95

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


6
यह स्पष्ट नहीं है कि आप क्या चाहते हैं। new line at the beginningएक रिक्त रेखा है और new line at endफ़ाइल में प्रत्येक पंक्ति पर लागू होती है। क्या आप एक उदाहरण पोस्ट कर सकते हैं?
पीपी

2
वास्तव में आप सिर्फ उपयोग कर सकते हैं $। यह कुछ हद तक सीमित है, लेकिन सरल मामलों में प्रयोग करने योग्य है।
Krzysztof Jabłoński

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

जवाबों:


84

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

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

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

कम से कम GNU grep में -z विकल्प है जो अशक्त वर्ण द्वारा grep को तोड़ने की रेखा बनाता है। हालाँकि, यह newline से मेल खाने के लिए newline या \ n का समर्थन नहीं करता है, बग रिपोर्ट देखें ।
जारनो

1
@jarno यह पी-ध्वज के साथ पैटर्न में \ n का समर्थन करता है
रुबेलियन

92

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

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

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


22

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

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

2
-Pएक GNU एक्सटेंशन है। जब स्थिति इसके लिए कॉल करती है तो मैं इसका उपयोग करने के लिए ठीक हूं (आमतौर पर लुकहैड / लुकबाइंड), लेकिन पॉसिक्स ग्रीप यह सिर्फ फाइल के साथ कर सकता है [[:space:]]
जोर्डम

1
FWIW, Solaris 'और BSD के grep manpages (दूसरों की जांच न करें) दोनों के लिए एक पैराग्राफ है -P। GNU वैसे भी काफी मानक है। :)
K3 --- rnc

1
मैनुअल पेज से: [-P] यह विकल्प FreeBSD में समर्थित नहीं है।
मारीआन Marierný

MacOsX के लिए कोई [-२] या तो: grep [-bcdDEFGhhiJLlmnOopqRSsUVvwxZ] [-A num] [-B num] [-सी [num] [-f फ़ाइल] [--binary-files = value] [--color [= जब]] [--colour [= जब]] [--context [= num]] [--label] [--line-बफर] [--null] [पैटर्न] [फ़ाइल। ..]
निकोलो

@ निकोलो आप brew install grepग्नू ग्रीप प्राप्त करना चाहेंगे , जो कई मायनों में बेहतर है। apple.stackexchange.com/questions/193288/...
herdrick

19

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

उदाहरण:

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

प्रिंटों bar


1
महान, ध्यान दें कि मुझे उत्तर में "@jarno" के बारे में सूचना नहीं मिलती है।
जर्नो

3
यह भी खूब रही! शेयर करने के लिए बहुत - बहुत शुक्रिया!
एलिसिया तांग

6

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

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

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


मेरी अज्ञानता को क्षमा करें, लेकिन प्रक्रिया विकल्प का उपयोग कर रहा है अभी तक एक और गैर-सकारात्मक स्थिति नहीं है, इसलिए गैर-पोर्टेबल सुविधा है? मैं क्या नहीं कर सकता <(p paste -sd_ file )?
मानवतावादी

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.