tl; डॉ
सुरक्षा के लिए, =~
साथ एक regex शाब्दिक प्रयोग नहीं करते।
इसके बजाय, उपयोग:
चाहे \b
और \<
/\>
काम सभी पर मेजबान मंच पर निर्भर करता है, नहीं मार :
- वे काम करते लिनक्स,
- लेकिन पर बीएसडी आधारित प्लेटफॉर्म पर इस तरह के रूप MacOS नहीं।
आप और अधिक जानना चाहते हैं, पर पढ़ें।
bash 3.2+
पर है (बशर्ते compat31
shopt
विकल्प सेट किया गया है), =~
ऑपरेटर की सही संकार्य होना चाहिए गैर उद्धृत क्रम में एक regex (रूप में पहचाना जाने अगर आप बोली दायां ऑपरेंड, =~
इसके बजाय नियमित स्ट्रिंग तुलना निष्पादित करता है)।
अधिक सही, कम से कम विशेष regex अक्षर और दृश्यों होना चाहिए गैर उद्धृत, तो यह उन सबस्ट्रिंग कि सचमुच लिया जाना चाहिए उद्धृत करने के लिए ठीक है और उपयोगी है; उदाहरण के लिए, [[ ' ab' =~ ^' ab' ]]
मैचों, क्योंकि ^
unquoted है और इस प्रकार सही ढंग से स्टार्ट-ऑफ-स्ट्रिंग एंकर के रूप में पहचाना जाता है।
हालांकि, वहाँ इस तरह के \<
और \s
रूप \
-prefixed निर्माणों हों उनके ((कम से कम) bash 4.x
जहां कुछ regex शाब्दिक ठीक प्रकार से पार्स नहीं कर रहे हैं, अर्थात् में एक बग प्रतीत होता है यदि आपको लगता है कि यह कोई बग नहीं है, तो मुझे) बताएं; bash 4.2.46
पर Linux
के रूप में व्यवहार:
# BUG
[[ ' word ' =~ \<word\> ]] && echo MATCHES # !! DOES NOT MATCH
[[ ' word ' =~ \\<word\\> ]] && echo MATCHES # !! BREAKS
[[ ' word ' =~ \\\<word\\\> ]] && echo MATCHES # !! DOES NOT MATCH
# WORKAROUNDS
re='\<word\>'; [[ ' word ' =~ $re ]] && echo MATCHES # OK - intermediate variable
[[ ' word ' =~ $(printf %s '\<word\>') ]] && echo MATCHES # OK - command subst.
क्रॉस-प्लेटफॉर्म समर्थन:
=~
दुर्लभ मामला एक की (? केवल मामले)bash
विशेषता है कि निर्मित है प्लेटफार्म-निर्भर: यह उस प्लेटफ़ॉर्म के रेगेक्स पुस्तकालयों का उपयोग करता है जो इसके चलते चल रहा है, जिसके परिणामस्वरूप विभिन्न प्लेटफ़ॉर्म पर विभिन्न रेगेक्स स्वाद एस।
उदाहरण के लिए, FreeBSD
/OSX
\<
/\>
और \b
पर समर्थित नहीं हैं, लेकिन [[:<:]]
और [[:>:]]
हैं। लिनक्स पर यह दूसरी तरफ है।
इस प्रकार, यह गैर-तुच्छ है और पोर्टेबल कोड लिखने के लिए अतिरिक्त देखभाल की आवश्यकता है जो =~
ऑपरेटर का उपयोग करता है।
एक तरफ के रूप में: बैश के '= ~' ऑपरेटर का व्यवहार _platform-dependent_ है, क्योंकि मेजबान प्लेटफॉर्म के रेगेक्स पुस्तकालयों का उपयोग किया जाता है। इस प्रकार, उदाहरण के लिए, स्वीकृत उत्तर में कार्यवाही के साथ, '\ b' और' \ <'/'\> 'ओएसएक्स जैसे बीएसडी-जैसी प्रणालियों पर काम नहीं करेगा। इसके विपरीत, ओएसएक्स '[[: \ <:]]' और '[[: \>:]]' का समर्थन करता है, जो लिनक्स पर काम नहीं करेगा। – mklement0