एक नियमित अभिव्यक्ति में, किन पात्रों को भागने की आवश्यकता है?


23

सामान्य तौर पर, एक नियमित अभिव्यक्ति में कौन से पात्रों को भागने की आवश्यकता है?

उदाहरण के लिए, निम्नलिखित वाक्यात्मक रूप से सही नहीं है:

echo '[]' | grep '[]'
grep: Unmatched [ or [^

लेकिन यह है syntatically सही:

echo '[]' | grep '\[]'
[]

क्या कोई दस्तावेज है जिस पर पात्रों को एक नियमित अभिव्यक्ति में भाग जाना चाहिए, और जो नहीं होना चाहिए?

जवाबों:


12

यह आवेदन पर निर्भर करता है। आपके उदाहरण [में एक तर्क के रूप में उद्धृत किया जाना चाहिए, grepलेकिन नहीं echo

शेल के लिए ( POSIX चश्मा से ):

कोटिंग का उपयोग शेल के कुछ वर्णों या शब्दों के विशेष अर्थ को निकालने के लिए किया जाता है। अगले पैराग्राफ में विशेष वर्णों के शाब्दिक अर्थ को संरक्षित करने के लिए उद्धरण का उपयोग किया जा सकता है, आरक्षित शब्दों को इस तरह से पहचाने जाने से रोका जा सकता है, और यहाँ-दस्तावेज़ प्रसंस्करण के भीतर पैरामीटर विस्तार और कमांड प्रतिस्थापन को रोका जा सकता है (यहाँ देखें-दस्तावेज़ देखें)।

यदि वे स्वयं का प्रतिनिधित्व करते हैं तो आवेदन निम्नलिखित वर्णों को उद्धृत करेगा:

|  &  ;  <  >  (  )  $  `  \  "  '  <space>  <tab>  <newline>

और निम्नलिखित को कुछ परिस्थितियों में उद्धृत करने की आवश्यकता हो सकती है। अर्थात्, ये पात्र IEEE Std 1003.1-2001 की इस मात्रा में कहीं और वर्णित स्थितियों के आधार पर विशेष हो सकते हैं:

*   ?   [   #   ˜   =   %

विभिन्न उद्धरण तंत्र भागने चरित्र, एकल उद्धरण, और दोहरे उद्धरण हैं। यहाँ-दस्तावेज़ उद्धरण के एक और रूप का प्रतिनिधित्व करता है; यहाँ देखें-दस्तावेज़।

विशिष्ट कार्यक्रमों (regexes, perl, awk का उपयोग करके) बचने पर अतिरिक्त आवश्यकताएं हो सकती हैं।


8

प्रत्येक एप्लिकेशन में 'विशेष' वर्णों का अपना सेट होगा। जिस मुद्दे पर आप भागे grep, वह शेल के साथ नहीं था । जिसके लिए पात्रों को उद्धृत करने की आवश्यकता है grep, "REGULAR EXPRESSIONS" पर मानवपृष्ठ के अनुभाग को पढ़ें।

शेल के लिए, वर्ण जो उद्धृत किए जाने चाहिए:

;'"`#$&*?[]<>{}\

और कोई भी व्हाट्सएप।

शेल के आधार पर, अन्य पात्रों को भी उद्धृत करने की आवश्यकता हो सकती है:

!^%

शेल के मैनपेज पर "शेल GRAMMAR" के नीचे देखें।


इतिहास विस्तार ( bashशामिल) के साथ कुछ गोले में , !अभी भी दोहरे उद्धरण चिह्नों में विस्तारित है, केवल एकल उद्धरण इसके विस्तार (या शेल विकल्प को चालू करना) को रोक देगा।
क्रिस डाउन

][हमेशा उद्धृत नहीं किया जाना चाहिए । मैं करने के लिए किसी भी संदर्भ नहीं मिला {और}
Matteo

8

कई प्रकार के नियमित अभिव्यक्ति हैं और विशेष वर्णों का सेट विशेष प्रकार पर निर्भर करता है। उनमें से कुछ नीचे वर्णित हैं। सभी मामलों में विशेष पात्र बैकस्लैश से बच जाते हैं \। उदाहरण के लिए [आप के \[बजाय लिखने के लिए । वैकल्पिक रूप से वर्णों (को छोड़कर ^) को एक के बाद एक करके वर्ग कोष्ठक के बीच संलग्न करके बच सकते हैं [[]

कुछ संदर्भों में जो वर्ण विशेष होते हैं जैसे ^(उप) अभिव्यक्ति की शुरुआत में विशेष सभी संदर्भों में बच सकते हैं।

जैसा कि दूसरों ने लिखा है: शेल में यदि आप एकल उद्धरणों के बीच की अभिव्यक्ति को नहीं जोड़ते हैं, तो आपको पहले से ही बच गए रेगेक्स में शेल के लिए विशेष वर्णों से बचना होगा। उदाहरण: इसके बजाय '\['आप बॉश की तरह बॉर्न संगत गोले में \\[(वैकल्पिक रूप "\["से "\\[") लिख सकते हैं लेकिन यह एक और कहानी है।

बेसिक रेगुलर एक्सप्रेशंस (BRE)

विस्तारित नियमित भाव (ERE)


3

grepBRE को इसकी रेगेक्स विधि के रूप में उपयोग करता है। यहाँ पर इसका अच्छा दस्तावेज़ीकरण है , एक सामान्य प्रकार का शब्द "किसी विशेष चरित्र या मेटाचैकर को अपने शाब्दिक रूप से प्राप्त करने के लिए बच जाएगा \n, एस्केप सिक्वेंस बनाने के लिए बच जाएगा ( \r, आदि)," हालांकि यह हमेशा सच नहीं होता है, उदाहरण के लिए, आपको प्रमोशन करना होगा भागने (और )उनके विशेष अर्थ (पश्चगामी) प्राप्त करने के लिए।


0

शेल कमांड निष्पादन से पहले कमांड लाइन को बदल सकता है। दोनों शेल और grepकुछ वर्णों के विशेष अर्थ को हटाने के लिए उद्धरण का उपयोग कर सकते हैं। बहरहाल, grepऔर गोले के अलग-अलग विशेष चरित्र हैं। इसके अलावा, बिना किसी विशेष वर्ण के जो मौजूदा विस्तार के परिणामस्वरूप नहीं था, शेल द्वारा कमांड निष्पादन से पहले हटा दिया जाता है।

echo '[]' | grep '[]'

शेल तर्क []को प्रेषित करता है grepऔर इसे एक विकृत ब्रैकेट अभिव्यक्ति के रूप में पार्स किया जाता है grep

echo '[]' | grep \[]

ऊपर, हम एक समान मामला देख सकते हैं। बैकलैश को हटा दिया जाता है और []तर्क के रूप में प्रसारित कर दिया जाता है grepgrepएक विकृत ब्रैकेट अभिव्यक्ति को पहचानता है।

echo '[]' | grep '\[]'

अंत में, इस मामले में, उद्धरण शेल द्वारा हटा दिए जाते हैं और \[]तर्क के रूप में प्रेषित किया जाता है grep, लेकिन इस विशिष्ट मामले में, शाब्दिक ब्रैकेट के रूप \[में व्याख्या की जाती है grep। खोल द्वारा विशेष वर्ण के रूप में बैकस्लैश की व्याख्या को रोकने के लिए उद्धरणों की आवश्यकता होती है।


OS POSIX विनिर्देशन

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