बैश = ~ रेगेक्स और https://regex101.com/


12

Https://regex101.com/ का उपयोग करके मैंने एक स्ट्रिंग में आईपी पते की पहली घटना को वापस करने के लिए एक नियमित अभिव्यक्ति का निर्माण किया।

RegExp:

(?:\d{1,3}\.)+(?:\d{1,3})

परिसीमन सहित RegExp:

/(?:\d{1,3}\.)+(?:\d{1,3})/

निम्नलिखित परीक्षण स्ट्रिंग के साथ:

eu-west                       140.243.64.99 

इसका पूर्ण मिलान लौटाता है:

140.243.64.99

कोई फर्क नहीं पड़ता कि मैं एंकर आदि के साथ क्या कोशिश करता हूं, निम्नलिखित बैश स्क्रिप्ट उत्पन्न नियमित अभिव्यक्ति के साथ काम नहीं करेगा।

temp="eu-west                       140.243.64.99            "
regexp="(?:\d{1,3}\.)+(?:\d{1,3})"
if [[ $temp =~ $regexp ]]; then
  echo "found a match"
else
  echo "No IP address returned"
fi

3
यह मेरे लिए एक नियमित अभिव्यक्ति की तरह दिखता है। बैश उस का समर्थन नहीं करता है।
Kusalananda

1
=~ऑपरेटर चर्चा की है मैनुअल में यहाँ है, जहां यह बैश का उपयोग करता है "विस्तारित नियमित अभिव्यक्ति" लिखा है। विस्तारित रेगेक्स को regex(7)मैन पेज में वर्णित किया गया है और संक्षेप में यहां प्रस्तुत किया गया है
ग्लेन जैकमैन 15

जवाबों:


15

\d"कोई भी अंक" कहने के लिए एक अमानवीय तरीका है। मुझे लगता है कि यह पर्ल से आता है, और बहुत सी अन्य भाषाएं और उपयोगिताएं पर्ल-संगत आरईएस (पीसीआरई) का भी समर्थन करती हैं। (और उदाहरण के लिए डेबियन स्ट्रेच में GNU grep 2.27 \wसामान्य मोड में भी शब्द वर्णों के लिए इसी तरह का समर्थन करता है।)

\dहालांकि, बैश समर्थन नहीं करता है , इसलिए आपको स्पष्ट रूप से उपयोग करने की आवश्यकता है [0-9]या [[:digit:]]। गैर-कैप्चरिंग समूह के लिए भी (?:..), (..)इसके बजाय उपयोग करें ।

यह प्रिंट होना चाहिए match:

temp="eu-west                       140.243.64.99            "
regexp="([0-9]{1,3}\.)+([0-9]{1,3})"
[[ $temp =~ $regexp ]] && echo match

2
क्या आपका GNU बिना grepसपोर्ट करता है ? \d-P
स्टीफन चेज़लस 16

@ स्टीफनचेज़लस, वूप्स, बिल्कुल नहीं। यह समर्थन करता है \wऔर \b, जो मैंने पर्ल से सीखा है, इसलिए मुझे वह भ्रम हो गया।
ilkachachu

1
यह कहना उचित नहीं है \dया PCRE "अमानवीय" है। वे काफी मानक हैं, मूल नियमित अभिव्यक्ति और विस्तारित नियमित अभिव्यक्तियों से बस एक अलग मानक है।
डैनियल फैरेल

1
@DanielFarrell, इस मामले में मानक जो POSIX निर्दिष्ट करता है, और इसके बारे में नहीं जानता है \d। हालाँकि आप उस PCRE में सही हैं, बल्कि मानक हैं, या कम से कम अच्छी तरह से परिभाषित हैं। कष्टप्रद मुद्दा जीएनयू ग्रेप (या glibc) का समर्थन करता है कि कुछ PCRE की तरह परमाणुओं, कम से कम है \wऔर \sERE की व्याख्या करते हैं, और उस संदर्भ में वे बहुत ज्यादा हैं गैरमानक। मेरा काम अच्छी तरह से आंशिक रूप से हो सकता है, और गलतबयानी जो \dइसी तरह GNU- समर्थित थी।
ilkachachu

4

(:...)और \dपर्ल या पीसीआरई नियमित अभिव्यक्ति ऑपरेटर हैं (जैसे कि जीएनयू grep -P)।

bashकेवल विस्तारित नियमित अभिव्यक्तियों का समर्थन करता है, grep -Eसिवाय इसके कि regexps के लिए शाब्दिक रूप से पारित किए गए के रूप में [[ text =~ regexp-here ]]एक निर्विवाद विस्तार के परिणाम के रूप में विरोध किया (के रूप में [[ text =~ $var ]]या [[ test =~ $(printf '%s\n' 'regexp-here') ]]), यह POSIX विस्तारित नियमित अभिव्यक्ति सुविधा सेट तक सीमित है।

तो सिस्टम पर भी जहां grep -E '\d'काम होगा (GNU EREs ने पहले ही perl regexps से कुछ एक्सटेंशन आयात कर लिए हैं जैसे \sकि भविष्य के संस्करण भी हो सकते हैं \d), आपको उपयोग करना होगा:

regexp='\d'
[[ $text =~ $regexp ]]

इसके bashलिए इसमें काम करना ( [[ $text =~ \d ]]नहीं) होगा।

PCREs का समर्थन करने वाले शेल के लिए, आप zshइसके बजाय उपयोग करना चाह सकते हैं :

set -o rematchpcre
[[ $text =~ '(?:\d{1,3}\.)+(?:\d{1,3})' ]]

ksh93 भी अपने पैटर्न मिलान के हिस्से के रूप में perl की तरह नियमित अभिव्यक्ति (पूरी तरह से संगत नहीं) के अपने कार्यान्वयन का समर्थन करता है। वहां, आप उपयोग करेंगे:

regexp='~(P)(?:\d{1,3}\.)+(?:\d{1,3})'
[[ $text = $regexp ]]

(के =बजाय ध्यान दें =~। आप अस्थायी चर का उपयोग करना चाहते हैं क्योंकि यह बहुत छोटी गाड़ी है जब आप नहीं करते हैं)


1

साइट regex101.com डिफ़ॉल्ट के रूप में PCRE (ऊपरी बाएं कोने को देखें) का उपयोग करती है, और इसमें "विस्तारित" रेगेक्स सिंटैक्स के लिए समर्थन का अभाव है। यह "पर्ल कम्पेटिबल रेग्युलर एक्सप्रेशंस" है, जो पेरल से आता है (जैसा कि उम्मीद करना उचित है)।

PCRE grep -Pकुछ शर्तों के तहत कुछ टूल्स (जैसे ) द्वारा समर्थित है , लेकिन मुहावर के अंदर बैश रेगेक्स समर्थन [[…]]केवल विस्तारित रेगेक्स (जैसे grep -E) के लिए है।

विस्तारित रेगेक्स में, गैर-कैप्चर (?…)कोष्ठक मौजूद नहीं है, और \ d भी गायब है। आपको सरल (…)और उपयोग करने की आवश्यकता है [0-9]:

regexp="([0-9]{1,3}\.)+([0-9]{1,3})"
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.