#!/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
~
शुरुआती नियमित अभिव्यक्ति में अग्रणी क्या करता है ?
#!/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
~
शुरुआती नियमित अभिव्यक्ति में अग्रणी क्या करता है ?
जवाबों:
~
वास्तव में ऑपरेटर का हिस्सा है =~
जो अपने को स्ट्रिंग अपने अधिकार पर विस्तारित नियमित अभिव्यक्ति के लिए छोड़ दिया की एक रेगुलर एक्सप्रेशन मिलान करता है।
[[ "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
grep -E
केवल GNU सिस्टम पर समझता है और केवल जब पैटर्न के रूप में एक अछूता चर का उपयोग करता है [[ $var = $pattern ]]
(देखें [[ 'a b' =~ a\sb ]]
बनाम p='a\sb'; [[ 'a b' =~ $p ]]
)। यह भी सावधान रहें कि शेल उद्धृत करना आरई ऑपरेटरों के अर्थ को प्रभावित करता है और शेल के टोकन के लिए कुछ वर्ण उद्धृत किए जाने की आवश्यकता है जो आरई प्रसंस्करण को प्रभावित कर सकते हैं। [[ '\' =~ [\/] ]]
झूठा लौटता है। ksh93
इससे भी बदतर मुद्दे हैं। zsh
एक सान दृष्टिकोण के लिए देखें (या बाश 3.1) जहां शेल और आरई उद्धृत स्पष्ट रूप से अलग हैं। का [
बनाया गया zsh
और yash
एक =~
ऑपरेटर भी है ।
off-topic
! +1 (
[[ "This is a fine mess." =~ T.........fin*es* ]]; [[ "This is a fine mess." =~ T.........fin\*es\* ]]
। या कि एक उद्धृत *
भी मेल खाते हैं? [[ "This is a fine mess." =~ "T.........fin*es*" ]]
।
[[ 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 = * ]]
(लेकिन फिर, ग्लब्स शेल भाषा का हिस्सा नहीं है, जबकि आरईएस नहीं हैं) के अनुरूप नहीं है।
आपको [[ 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)).
लंबी कहानी छोटी, =~
एक ऑपरेटर है, जैसे ==
और !=
। यह स्ट्रिंग में वास्तविक रेगेक्स के साथ इसके दाईं ओर कुछ भी नहीं है।
=~
वास्तविक जीवन में उपयोग को दर्शाने वाले कुछ उदाहरणों का पता लगा सकते हैं ...?
man [[ expresssion ]]
और man [[
कुछ भी नहीं लौटा। help [[
उपयोगी जानकारी लौटाता है- चूंकि [[
एक आंतरिक बैश कमांड - लेकिन यह नहीं कहता है कि =~
बेसिक या विस्तारित रेगेक्स सिंटैक्स का उपयोग करता है या नहीं । Man आपके द्वारा उद्धृत पाठ बैश मैन पेज से है। मुझे लगता है कि आपने "बैश मैन पेजों को पढ़ा" कहा था, लेकिन सबसे पहले, मैंने सोचा कि आप बैश के भीतर मैन पेजों को पढ़ें। किसी भी दर पर, man bash
एक बड़ी फ़ाइल लौटाता है, जो 4139 लाइनें (72 पृष्ठ) लंबी होती है। इसे दबाकर खोजा जा सकता है /▒▒▒
, जो एक रेगीक्स लेता है, जिसका स्वाद - जैसे- =~
निर्दिष्ट नहीं है।