मैं बैश लिपियों में नियमित अभिव्यक्ति का उपयोग कैसे करूं?


83

मैं यह जांचना चाहता हूं कि क्या एक चर में एक नियमित अभिव्यक्ति का उपयोग करके वैध वर्ष है। बैश मैनुअल पढ़ने से मुझे समझ में आ रहा है कि मैं ऑपरेटर = ~ का उपयोग कर सकता हूं

नीचे दिए गए उदाहरण को देखते हुए, मैं "ओके नहीं" देखने की अपेक्षा करूंगा लेकिन मुझे "ओके" दिखाई देगा। मैं क्या गलत कर रहा हूं?

i="test"
if [ $i=~"200[78]" ]
then
  echo "OK"
else
  echo "not OK"
fi


ध्यान दें कि आसपास रिक्त स्थान की कमी के कारण यह विफल हो रहा था =~
फेडोरक्वी 'एसओ ने

जवाबों:


116

इसे 3.1 और 3.2 के बीच बदल दिया गया था:

यह बैश -3 की रिलीज़ के बाद से बैश -3 में जोड़े गए नए फीचर्स का एक विवरण है।

[[कमांड का = ~ ऑपरेटर] स्ट्रिंग तर्क को उद्धृत करते हुए अब स्ट्रिंग मिलान को बाध्य करता है, जैसा कि अन्य पैटर्न-मिलान ऑपरेटरों के साथ होता है।

इसलिए बिना उद्धरण के इसका उपयोग करें:

i="test"
if [[ $i =~ 200[78] ]] ; then
    echo "OK"
else
    echo "not OK"
fi

1
अगर मैं बोली नहीं लगा सकता तो रेगेक्स में रिक्त स्थान होने पर मैं स्थिति को कैसे संभाल सकता हूं? यदि रेगेक्स उदा है तो a +bयह एक सिंटैक्स त्रुटि की रिपोर्ट करेगा ...
एल्डरथ

5
@ बुजुर्ग: a\ \+bअंतरिक्ष और प्लस चरित्र से बचने के लिए उपयोग करें ।
ब्लिनरी

8

आपको ऑपरेटर के आसपास रिक्त स्थान की आवश्यकता है = ~

i = "परीक्षण"
अगर [[$ i = ~ "200 [78]"]];
फिर
  इको "ओके"
अन्य
  गूंज "ठीक नहीं"
फाई

3
paxdiablo का जवाब सही है, यहां रिक्त स्थान जोड़ने से मदद नहीं मिलती है (आप अब 2008 के लिए "ठीक नहीं है", एकमात्र स्ट्रिंग जो मेल खाता है, उसका शाब्दिक अर्थ है "200 [78]")।
मार्सेल स्टिमबर्ग
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.