इसके विभिन्न उपकरण और संस्करण नियमित अभिव्यक्ति के विभिन्न रूपों का समर्थन करते हैं। प्रत्येक का प्रलेखन आपको बताएगा कि वे क्या समर्थन करते हैं।
मानक मौजूद हैं ताकि सभी सुविधाओं के एक न्यूनतम सेट पर भरोसा कर सकें जो सभी अनुरूप अनुप्रयोगों में उपलब्ध हैं।
उदाहरण के लिए, के सभी आधुनिक कार्यान्वयन sed
और grep
के रूप में POSIX द्वारा निर्दिष्ट (कम से कम एक संस्करण या मानक के अन्य, लेकिन यह मानक पिछले कुछ दशकों में इस संबंध में एक बहुत विकसित नहीं किया गया है) बुनियादी नियमित अभिव्यक्ति लागू।
POSIX BRE और ERE में, आपके पास [:alnum:]
वर्ण वर्ग है। यह आपके लोकेल में अक्षरों और अंकों से मेल खाता है (ध्यान दें कि अक्सर इसमें बहुत अधिक शामिल होता है a-zA-Z0-9
जब तक कि लोकेल सी नहीं हो)।
इसलिए:
grep -x '[[:alnum:]_]\{1,\}'
एक या अधिक अलंकरण या _ से मेल खाता है।
[\w]
POSIX द्वारा बैकस्लैश या मैच के लिए आवश्यक है w
। तो तुम एक नहीं मिलेगा grep
या sed
कार्यान्वयन जहां कि उपलब्ध है (जब तक के माध्यम से गैर मानक विकल्प)।
\w
अकेले के लिए व्यवहार POSIX द्वारा निर्दिष्ट नहीं है, इसलिए कार्यान्वयन को वे जो चाहते हैं करने की अनुमति है। जीएनयू grep
ने कहा कि बहुत पहले।
GNU grep
में अपना स्वयं का regexp इंजन होता था, लेकिन अब यह GNU libc का उपयोग करता है (हालाँकि यह अपनी प्रति एम्बेड करता है)।
यह आपके लोकेल में अलनम्स और अंडरस्कोर का मिलान करने के लिए है। हालाँकि, वर्तमान में यह एक बग है कि यह केवल एकल-बाइट वर्णों से मेल खाता है (उदाहरण के लिए, UTF-8 लोकेल में नहीं, भले ही यह स्पष्ट रूप से एक अक्षर है और भले ही यह उन सभी स्थानों में मेल खाता हो, जहां é एक है चरित्र)।
\w
Perl regexp और PCRE में एक regexp ऑपरेटर भी है । PCRE / perl POSIX नियमित अभिव्यक्ति नहीं हैं, वे पूरी तरह से एक और चीज हैं।
अब, जिस तरह से जीएनयू grep -P
पीसीआरई का उपयोग करता है, यह बिना किसी मुद्दे के समान है -P
। इसका उपयोग करके यद्यपि वहाँ काम किया जा सकता है (*UCP)
(हालाँकि गैर-UTF8 स्थानों में इसके दुष्प्रभाव भी हैं)।
GNU sed
अपने स्वयं के regexps के लिए GNU libc के रेगेक्स का भी उपयोग करता है। यह इसे इस तरह से उपयोग करता है, हालांकि इसमें GNU के समान बग नहीं है grep
।
GNU sed
PCREs का समर्थन नहीं करता है। कोड में कुछ साक्ष्य हैं जिन्हें पहले प्रयास किया गया है, लेकिन यह अब एजेंडा में नहीं है।
यदि आप पर्ल के नियमित भाव चाहते हैं, तो बस उपयोग करें perl
।
अन्यथा, मैं कहूंगा कि आपके sed
/ के विशेष कार्यान्वयन के फर्जी गैर-मानक विशेषता पर भरोसा करने के बजाय grep
मानक और उपयोग के साथ रहना बेहतर होगा [_[:alnum:]]
।
[_[:alnum:]]
एक अच्छा समाधान है जो मुझे इसे[\w/]
([_[:alnum:]/]
उस स्थिति में) की तरह विस्तारित करने की अनुमति देता है ।