Grep में नई लाइन के लिए एक पैटर्न कैसे दें? शुरुआत में नई लाइन, अंत में नई लाइन। नियमित अभिव्यक्ति का तरीका नहीं। कुछ ऐसा है \ n
$
। यह कुछ हद तक सीमित है, लेकिन सरल मामलों में प्रयोग करने योग्य है।
Grep में नई लाइन के लिए एक पैटर्न कैसे दें? शुरुआत में नई लाइन, अंत में नई लाइन। नियमित अभिव्यक्ति का तरीका नहीं। कुछ ऐसा है \ n
$
। यह कुछ हद तक सीमित है, लेकिन सरल मामलों में प्रयोग करने योग्य है।
जवाबों:
grep
पैटर्न को व्यक्तिगत रेखाओं के विरुद्ध मिलान किया जाता है ताकि इनपुट में मिली एक नई रेखा से मेल खाने के पैटर्न के लिए कोई रास्ता न हो।
हालाँकि आप इस तरह खाली लाइनें पा सकते हैं:
grep '^$' file
grep '^[[:space:]]*$' file # include white spaces
pcregrep
नियमित के बजाय कोशिश करें grep
:
pcregrep -M "pattern1.*\n.*pattern2" filename
-M
विकल्प यह, कई पंक्तियों भर में मैच के लिए है ताकि आप के रूप में नई-पंक्तियों के लिए खोज सकते की अनुमति देता है \n
।
आप इस तरह से उपयोग कर सकते हैं ...
grep -P '^\s$' file
-P
पर्ल रेगुलर एक्सप्रेशंस (POSIX के लिए एक एक्सटेंशन grep
) के लिए उपयोग किया जाता है ।\s
सफेद अंतरिक्ष वर्णों का मिलान करें; यदि इसके बाद *
, यह एक खाली रेखा से भी मेल खाता है।^
लाइन की शुरुआत से मेल खाता है। $
रेखा के अंत से मेल खाता है। -P
एक GNU एक्सटेंशन है। जब स्थिति इसके लिए कॉल करती है तो मैं इसका उपयोग करने के लिए ठीक हूं (आमतौर पर लुकहैड / लुकबाइंड), लेकिन पॉसिक्स ग्रीप यह सिर्फ फाइल के साथ कर सकता है [[:space:]]
।
-P
। GNU वैसे भी काफी मानक है। :)
brew install grep
ग्नू ग्रीप प्राप्त करना चाहेंगे , जो कई मायनों में बेहतर है। apple.stackexchange.com/questions/193288/...
@Jarno के लिए धन्यवाद, मुझे -z विकल्प के बारे में पता है और मुझे पता चला कि जब -२ विकल्प के साथ GNU grep का उपयोग किया \n
जाता है , तो इसके खिलाफ मिलान संभव है । :)
उदाहरण:
grep -zoP 'foo\n\K.*'<<<$'foo\nbar'
प्रिंटों bar
वर्कअराउंड के लिए (बिना पोर्टेबल का उपयोग किए बिना -P
), आप अस्थायी रूप से एक नई-लाइन के चरित्र को अलग से बदल सकते हैं और इसे बदल सकते हैं, जैसे:
grep -o "_foo_" <(paste -sd_ file) | tr -d '_'
मूल रूप से यह सटीक मैच की तलाश में है, _foo_
जहां _
इसका मतलब है \n
(इसलिए __
= \n\n
)। आपको इसे वापस अनुवाद करने की आवश्यकता नहीं है tr '_' '\n'
, क्योंकि प्रत्येक पैटर्न को नई पंक्ति में वैसे भी मुद्रित किया जाएगा, इसलिए निकालना _
पर्याप्त है।
<(p paste -sd_ file )
?
new line at the beginning
एक रिक्त रेखा है औरnew line at end
फ़ाइल में प्रत्येक पंक्ति पर लागू होती है। क्या आप एक उदाहरण पोस्ट कर सकते हैं?