दो पैटर्न के बीच (और शामिल) प्रिंट लाइनें


16

मैं उन रेखाओं से पकड़ बनाना शुरू करना चाहता हूं CK, जो रेखा के अंत में हैं और जब रेखा के अंत में हरियाली बंद Dहो जाती है। मैंने कोशिश की grep "$CK" "$D" file..txt, लेकिन यह काम नहीं किया।

इनपुट:

kkkkkkkkkkk   
jjjjjjjjjjjjjjjjjj  
gggggggggggg/CK  
JHGHHHHHHHH   
HJKHKKLKLLL   
JNBHBHJKJJLKKL  
JLKKKLLKJLKJ/D  
GGGGGGGGGGGGGG  
GGGGGGGGGGGGGG

वांछित उत्पादन:

gggggggggggg/CK  
JHGHHHHHHHH   
HJKHKKLKLLL   
JNBHBHJKJJLKKL  
JLKKKLLKJLKJ/D

जवाबों:


21

आप या का उपयोग करके बेहतर हैं

awk '/CK$/,/D$/' file.txt

या

sed -n '/CK$/,/D$/p' file.txt

यदि आप पर जोर देते हैं , तो यहाँ एक GNU grep तरीका है

grep -oPz '(?s)(?<=\n)\N+CK\n.*?D(?=\n)' file.txt

यहाँ

-P perl-regexp को सक्रिय करता है

-zNUL को लाइन विभाजक सेट करता है। यह पूरी फाइल को एक सिंगल लाइन के रूप में देखने के लिए मजबूर करता है

-o प्रिंट्स केवल मेल खाते हैं

(?s)PCRE_DOTALL को सक्रिय करता है, इसलिए .कोई भी वर्ण या नई रेखा पाता है

\N न्यूलाइन को छोड़कर कुछ भी मेल खाता है

.*?पाता है। nongreedy मोड में

(?<=..) दिखावे के पीछे है

(?=..) एक नज़र आगे की ओर इशारा है


क्यों नहीं जोड़ा गया स्लैश? इस तरहawk '/\/CK/,/\/D/' input
राहुल पाटिल

@RahulPatil, ऐसा इसलिए है क्योंकि ओपी ने कहा है कि लाइन के अंत में "CK" वाली रेखाओं से पकड़ बनाना शुरू करें और जब रेखा का "D" हो तो रोकना बंद कर दें
iruvar

यह मुझे लगता है, आप regex की मजबूत समझ है .. मैं उस स्तर को समझ नहीं पाया, तो क्या आप बता सकते हैं कि पीसीआरई grep के अंतिम
राहुल पाटिल

@RahulPatil ने कुछ स्पष्टीकरण :-)
iruvar

@RohitPatil, मैं फ़ाइल से मेल खाते चयन को हटाना चाहता हूं। क्या मै वह कर सकता हूं?
राणा खान

0

यदि आप BSD का उपयोग कर रहे हैं grep(perl regex param का समर्थन नहीं करता है -P), तो यहां वर्कअराउंड है:

grep -o "aaa.*cdn" <(paste -sd_ file) | tr '_' '\n'

यह सभी लाइनों को समेट कर (नई लाइनों को _वर्ण के साथ बदलकर ) काम करता है , एक-पंक्ति पैटर्न की जाँच करता है और अपनी मूल स्थिति में वापस लाइनों का विस्तार करता है।

यदि आप GNU का उपयोग कर रहे हैं grep, तो आप मल्टीलाइन मैच को प्राप्त कर सकते हैं grep, लेकिन आपको किसी अन्य उत्तर में उल्लिखित grep( -P) की तरह perl-regexp का उपयोग करना होगा । आप अभी भी इसके बजाय macOS पर GNU इंस्टॉल कर सकते हैं और उपयोग कर सकते हैं।grepbrew install grepggrep


वैकल्पिक रूप से आप उपयोग कर सकते हैं pcregrepजो मल्टी-लाइन पैटर्न ( -M) का समर्थन करता है ।


आप exकमांड का भी उपयोग कर सकते हैं , जैसे:

ex +"/aaa/;/cdn/p" -scq! file
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.