बैश टेस्ट: "= ~" क्या करता है?


40
#!/bin/bash
INT=-5

if [[ "$INT" =~ ^-?[0-9]+$ ]]; then

echo "INT is an integer."

else

echo "INT is not an integer." >&2

exit 1

fi

~शुरुआती नियमित अभिव्यक्ति में अग्रणी क्या करता है ?



5
क्या आपने बैश मैनुअल पढ़ा है? आप क्या अस्पष्ट पाते हैं?
इकारस

3
के लिए = ~ बैश आदमी पेज खोजें
जेफ स्कालर

जवाबों:


46

~वास्तव में ऑपरेटर का हिस्सा है =~जो अपने को स्ट्रिंग अपने अधिकार पर विस्तारित नियमित अभिव्यक्ति के लिए छोड़ दिया की एक रेगुलर एक्सप्रेशन मिलान करता है।

[[ "string" =~ pattern ]]

ध्यान दें कि स्ट्रिंग को उद्धृत किया जाना चाहिए, और यह कि नियमित अभिव्यक्ति को उद्धृत नहीं किया जाना चाहिए।

पर्ल प्रोग्रामिंग भाषा में एक समान ऑपरेटर का उपयोग किया जाता है।

नियमित रूप से समझा जाने वाले भाव bashवही होते हैं जो कि GNU ध्वज के grepसाथ समझता है -E, अर्थात नियमित अभिव्यक्तियों का विस्तारित सेट।


कुछ हद तक विषय, लेकिन यह जानने के लिए अच्छा है:

कैप्चरिंग समूहों से युक्त एक नियमित अभिव्यक्ति के खिलाफ मिलान करते समय, प्रत्येक समूह द्वारा कैप्चर किए गए स्ट्रिंग का हिस्सा BASH_REMATCHसरणी में उपलब्ध होता है । Zeroth / इस सरणी मेल खाती में के लिए प्रवेश &के प्रतिस्थापन पैटर्न में sedकी प्रतिस्थापन आदेश (या $&पर्ल में) है, जो स्ट्रिंग है कि नमूने का मिलान का सा है, जबकि इंडेक्स को 1 पर प्रविष्टियों और उसके बाद मेल खाती है करने के लिए \1, \2, आदि एक sedप्रतिस्थापन पैटर्न (या $1, $2पर्ल में आदि) में, यानी प्रत्येक कोष्ठक द्वारा बिट्स का मिलान।

उदाहरण:

string=$( date +%T )

if [[ "$string" =~ ^([0-9][0-9]):([0-9][0-9]):([0-9][0-9])$ ]]; then
  printf 'Got %s, %s and %s\n' \
    "${BASH_REMATCH[1]}" "${BASH_REMATCH[2]}" "${BASH_REMATCH[3]}"
fi

यह आउटपुट हो सकता है

Got 09, 19 and 14

यदि वर्तमान समय 09:19:14 होता है।

सरणी नाम का REMATCHथोड़ा हिस्सा BASH_REMATCH"रेगुलर एक्सप्रेशन मैच", "आरई-मैच" से आता है।


गैर bashबॉर्न-जैसे गोले में, कोई exprसीमित नियमित अभिव्यक्ति मिलान (केवल मूल नियमित अभिव्यक्ति का उपयोग करके) के लिए भी उपयोग कर सकता है ।

एक छोटा सा उदाहरण:

$ string="hello 123 world"
$ expr "$string" : ".*[^0-9]\([0-9][0-9]*\)"
123

2
यह वही है जो grep -Eकेवल GNU सिस्टम पर समझता है और केवल जब पैटर्न के रूप में एक अछूता चर का उपयोग करता है [[ $var = $pattern ]](देखें [[ 'a b' =~ a\sb ]]बनाम p='a\sb'; [[ 'a b' =~ $p ]])। यह भी सावधान रहें कि शेल उद्धृत करना आरई ऑपरेटरों के अर्थ को प्रभावित करता है और शेल के टोकन के लिए कुछ वर्ण उद्धृत किए जाने की आवश्यकता है जो आरई प्रसंस्करण को प्रभावित कर सकते हैं। [[ '\' =~ [\/] ]]झूठा लौटता है। ksh93इससे भी बदतर मुद्दे हैं। zshएक सान दृष्टिकोण के लिए देखें (या बाश 3.1) जहां शेल और आरई उद्धृत स्पष्ट रूप से अलग हैं। का [बनाया गया zshऔर yashएक =~ऑपरेटर भी है ।
स्टीफन चेज़लस

2
बहुत अच्छा off-topic! +1 (
JJoao

@ StéphaneChazelas यह कैसे "saner" zsh में इस मैच ?: के दोनों कि है [[ "This is a fine mess." =~ T.........fin*es* ]]; [[ "This is a fine mess." =~ T.........fin\*es\* ]]। या कि एक उद्धृत *भी मेल खाते हैं? [[ "This is a fine mess." =~ "T.........fin*es*" ]]
सोरंटार

यह बहुत ही सरल नियम है, इसमें सान (IMO) है। शेल कोटिंग और आरई एस्केपिंग स्पष्ट रूप से अलग हैं। में [[ a =~ .* ]]या [[ a =~ '.*' ]]या [[ a =~ \.\* ]], एक ही .*फिर से पारित कर दिया है =~ऑपरेटर। OTH, में bash, [[ '\' =~ [)] ]]एक त्रुटि लौटाता है, क्या आप यह जानने की कोशिश किए बिना कि क्या [[ '\' =~ [\)] ]]मेल खाता है? कैसे के बारे में [[ '\' =~ [\/] ]](यह ksh93 में करता है)। कैसे c='a-z'; [[ a =~ ["$c"] ]]( =ऑपरेटर के साथ तुलना ) के बारे में? यह भी देखें: [[ '\' =~ [^]"."] ]]जो रिटर्न झूठी ... ध्यान दें कि आप कर सकते हैं shopt -s compat31में bashप्राप्त करने के लिए zshव्यवहार।
स्टीफन चेज़लस

zshके लिए / bash -o compat31का व्यवहार [[ a =~ '.*' ]]भी संगत है [ a '=~' '.*' ]( [कार्यान्वयन के लिए जो समर्थन करते हैं =~) या expr a : '.*'। ओटीओएच, यह [[ a = '*' ]]बनाम [[ a = * ]](लेकिन फिर, ग्लब्स शेल भाषा का हिस्सा नहीं है, जबकि आरईएस नहीं हैं) के अनुरूप नहीं है।
स्टीफन चेजलस

4

आपको [[ expression ]]अनुभाग के अंतर्गत बैश मैन पेज पढ़ना चाहिए ।

An additional binary operator, =~, is available, with the same precedence as == and !=. When it is used, the string to the right of the operator is considered an extended regular expression and matched accordingly (as in regex(3)).

लंबी कहानी छोटी, =~एक ऑपरेटर है, जैसे ==और !=। यह स्ट्रिंग में वास्तविक रेगेक्स के साथ इसके दाईं ओर कुछ भी नहीं है।


क्या आप =~वास्तविक जीवन में उपयोग को दर्शाने वाले कुछ उदाहरणों का पता लगा सकते हैं ...?
जॉर्ज वासिलिउ

1
@GeorgeVasiliou मैं इसे स्क्रिप्ट में अक्सर उपयोग करता हूं जो एक कमांड से आउटपुट को एक चर में डालते हैं। फिर चर को देखने के लिए जाँच की जाती है कि क्या यह कुछ स्ट्रिंग पैटर्न से मेल खाता है। यह उदाहरण के लिए उपयोगी है यदि आप उस कमांड से कुछ त्रुटि आउटपुट के आधार पर कुछ कार्रवाई करना चाहते हैं।
माइकल मार्टिनेज

कुछ के लिए @Sokel, "RTFM" की तुलना में आसान है। Nothing man [[ expresssion ]]और man [[कुछ भी नहीं लौटा। help [[उपयोगी जानकारी लौटाता है- चूंकि [[एक आंतरिक बैश कमांड - लेकिन यह नहीं कहता है कि =~बेसिक या विस्तारित रेगेक्स सिंटैक्स का उपयोग करता है या नहीं । Man आपके द्वारा उद्धृत पाठ बैश मैन पेज से है। मुझे लगता है कि आपने "बैश मैन पेजों को पढ़ा" कहा था, लेकिन सबसे पहले, मैंने सोचा कि आप बैश के भीतर मैन पेजों को पढ़ें। किसी भी दर पर, man bashएक बड़ी फ़ाइल लौटाता है, जो 4139 लाइनें (72 पृष्ठ) लंबी होती है। इसे दबाकर खोजा जा सकता है /▒▒▒, जो एक रेगीक्स लेता है, जिसका स्वाद - जैसे- =~निर्दिष्ट नहीं है।
एलेक्स क्विन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.