जवाबों:
आप एक गैर-लालची (या आलसी) मैच की तलाश कर रहे हैं। नियमित अभिव्यक्तियों में एक गैर-लालची मैच पाने के लिए आपको ?
मात्रा के बाद संशोधक का उपयोग करने की आवश्यकता होती है । उदाहरण के लिए आप बदल सकते हैं .*
करने के लिए .*?
।
डिफ़ॉल्ट रूप से grep
गैर-लालची संशोधक का समर्थन नहीं करता है, लेकिन आप grep -P
पर्ल सिंटैक्स का उपयोग कर सकते हैं ।
.
से मेल खाने की अनुमति देता है उसे डॉटॉल या सिंगल-लाइन मोड कहा जाता है; रूबी ही एकमात्र है जो इसे मल्टीलाइन कहती है । अन्य जायके में, बहुस्तरीय वह मोड है जो एंकर ( ^
और $
) को लाइन सीमाओं पर मैच करने की अनुमति देता है। रूबी के पास कोई समकक्ष मोड नहीं है क्योंकि रूबी में वे हमेशा उस तरह से काम करते हैं।
-P
मुझ पर एक पूरी तरह से नया था, मैं खुशी से साल के लिए दूर रहा है, और केवल का उपयोग कर -E
... इतने साल बर्बाद! - स्वयं पर ध्यान दें: मैन पेजों को (और भी अधिक!) नियमित रूप से पढ़ें, आप कभी भी पर्याप्त स्विच और विकल्प नहीं पचाते।
grep
समर्थन नहीं करता है -P
, लेकिन यदि आप उपयोग egrep
करते हैं तो आप .*?
उसी परिणाम को प्राप्त करने के लिए पैटर्न का उपयोग कर सकते हैं । egrep -o 'start.*?end' text.html
-P
लेकिन -E
कॉल करेगा egrep
इसलिए सुझाया गया .*?
कार्य ठीक है।
वास्तव में .*?
केवल काम करता है perl
। मुझे यकीन नहीं है कि समकक्ष grep विस्तारित regexp सिंटैक्स क्या होगा। सौभाग्य से आप grep के साथ perl syntax का उपयोग कर सकते हैं इसलिए grep -P
काम करेगा लेकिन grep -E
जो egrep
काम नहीं करेगा (यह लालची होगा)।
इसे भी देखें: http://blog.vinceliu.com/2008/02/non-greedy- अनियमित-expression-matching.html
grep -P
GNU grep 2.9 में काम नहीं करता है - बस इसे आज़माया (इसमें कोई त्रुटि नहीं है, बस चुपचाप इसे लागू नहीं करता है ?
। अंत में न तो वर्ग नहीं करता है जैसे:env|grep '[^\=]*\='
grep -P
विकल्प या pgrep
आदेश नहीं है , लेकिन egrep
महान काम करता है।
pgrep
मेरे OS X 10.9 बॉक्स पर एक कमांड है, लेकिन यह एक पूरी तरह से अलग कार्यक्रम है जिसका उद्देश्य "नाम से प्रक्रिया या संकेत प्राप्त करना" है।
मेरा धागा जो इस धागे में सामान बाहर निकालने के बाद काम करता है:
echo "hi how are you " | grep -shoP ".*? "
बस यह सुनिश्चित करें कि आप अपनी प्रत्येक पंक्ति में एक स्थान जोड़ लें
(मेरा शब्दों को बाहर निकालने के लिए लाइन सर्च द्वारा एक लाइन थी)
-shoP
अच्छा स्मरक :)
echo "bbbbb" | grep -shoP 'b.*?b'
सीखने का एक छोटा सा अनुभव है। केवल स्पष्ट रूप से आलसी के रूप में मेरे लिए काम करने वाली चीज।
grep
गैर-लालची मैच के लिए grep
आप एक नकारात्मक चरित्र वर्ग का उपयोग कर सकते हैं। दूसरे शब्दों में, वाइल्डकार्ड से बचने की कोशिश करें।
उदाहरण के लिए, पृष्ठ सामग्री से jpeg फ़ाइलों के लिए सभी लिंक लाने के लिए, आप उपयोग करेंगे:
grep -o '"[^" ]\+.jpg"'
मल्टीपल लाइन से निपटने के लिए, xargs
पहले इनपुट को पाइप से करें । प्रदर्शन के लिए, का उपयोग करें ripgrep
।
संक्षिप्त उत्तर अगली नियमित अभिव्यक्ति का उपयोग कर रहा है:
(?s)<car .*? model=BMW .*?>.*?</car>
A (थोड़ा) अधिक जटिल उत्तर है:
(?s)<([a-z\-_0-9]+?) .*? model=BMW .*?>.*?</\1>
यह निम्नलिखित पाठ में car1 और car2 से मेल करना संभव बनाता है
<car1 ... model=BMW ...>
...
...
...
</car1>
<car2 ... model=BMW ...>
...
...
...
</car2>
क्षमा करें, मुझे 9 साल की देरी हो गई है, लेकिन यह 2020 में दर्शकों के लिए काम कर सकता है।
तो मान लीजिए आपके पास एक लाइन है जैसे "Hello my name is Jello"
। अब आप उन शब्दों को ढूंढना चाहते हैं जो बीच में से किसी भी वर्ण के साथ शुरू 'H'
और समाप्त होते हैं 'o'
। और हम उन पंक्तियों को नहीं चाहते जिन्हें हम केवल शब्द चाहते हैं। तो इसके लिए हम अभिव्यक्ति का उपयोग कर सकते हैं:
grep "H[^ ]*o" file
इससे सभी शब्द वापस आ जाएंगे। जिस तरह से यह काम करता है वह है: यह बीच के अंतरिक्ष वर्ण के बजाय सभी वर्णों को अनुमति देगा, इस तरह हम एक ही पंक्ति में कई शब्दों से बच सकते हैं।
अब आप अंतरिक्ष चरित्र को अपने इच्छित किसी अन्य चरित्र से बदल सकते हैं। मान लें कि प्रारंभिक लाइन थी "Hello-my-name-is-Jello"
, तो आप अभिव्यक्ति का उपयोग करके शब्द प्राप्त कर सकते हैं:
grep "H[^-]*o" file
मुझे पता है कि यह एक मृत पोस्ट का एक सा है, लेकिन मैंने अभी देखा कि यह काम करता है। इसने मेरे आउटपुट से क्लीन-अप और क्लीनअप दोनों को हटा दिया।
> grep -v -e 'clean\-\?up'
> grep --version grep (GNU grep) 2.20