एक बैश स्क्रिप्ट में, पैटर्न के अनुसार एक स्ट्रिंग निकालना


17

बैश में, मान लें कि मेरे पास एक स्ट्रिंग है strname:

strname="ph7go04325r"

मैं पहले "3" चरित्र और अंतिम "r" चरित्र के बीच के पात्रों को निकालना चाहूंगा strname, जिसके परिणामस्वरूप एक स्ट्रिंग में बचत होगी strresult। उपरोक्त उदाहरण में, परिणाम strresultहोगा:

strresult="25"

पहला "3"चरित्र जरूरी नहीं है कि स्ट्रिंग स्थिति में 8 में strname; इसी तरह, पिछले "r"है नहीं जरूरी स्ट्रिंग की स्थिति में 11. इस प्रकार, निम्नलिखित तार के दोनों strnameउपज चाहिए strresult="25":

strname="ph11go04325raa"
strname="325r"
strname="rgo04325raa"

साथ ही, strname=ph12go04330raa"उपज देना चाहिए strresult="30"

मैं स्क्रिप्टिंग को कोसने के लिए नया हूं, और मुझे नहीं पता कि इस तरह से मिलान करने वाले स्ट्रिंग पैटर्न कहां से शुरू करें। क्या तुम्हारे पास कोई सुझाव है?

जवाबों:


28

इसे पूरा करने के लिए आप bash (3.0 या इसके बाद के संस्करण) में regex का उपयोग कर सकते हैं:

if [[ $strname =~ 3(.+)r ]]; then
    strresult=${BASH_REMATCH[1]}
else
    echo "unable to parse string $strname"
fi

बैश में, एक रेगेक्स से कैप्चर समूहों को विशेष सरणी में रखा जाता है BASH_REMATCH। एलिमेंट 0 में पूरा मैच होता है, और 1 में पहले कैप्चर ग्रुप के लिए मैच होता है।


10

मानक shसिंटैक्स में (इसलिए किसी भी संस्करण bashया किसी अन्य POSIX अनुरूप शेल के साथ काम करेगा ), आप करेंगे:

case $strname in
  (*3*r*) 
    strresult=${strname#*3}
    strresult=${strresult%r*};;
  (*)
    printf >&2 '%s\n' "Unable to parse string $strname"
esac

पुराना exprसमाधान भी देखें जो 35 साल पुराने यूनियनों पर भी काम करेगा:

expr "x$strname" : 'x[^3]*3\(.*\)r'

इसके साथ पुरानी विडंबनाexpr यह है कि यदि मैच विफल हो जाता है, तो आपको एक गैर-शून्य निकास स्थिति (ठीक) मिलती है, लेकिन यदि आप लौटे हुए तार 0 (जैसे strname=zz300rzz) का समाधान करते हैं, तो आपको गैर-शून्य निकास स्थिति भी मिलती है ।


मुझे लगता है कि आपका वाक्यांश गलत तरीके से बताता है कि यह केवल पुराने संस्करणों के साथ किया जा सकता है। पैरामीटर विस्तार, निश्चित रूप से, आधुनिक गोले में अभी भी एक अच्छा दृष्टिकोण है।
कोजिरो

1
@ कोकोजी, मैं देख रहा हूं कि आपका क्या मतलब है। प्रारंभिक सूत्रीकरण जॉर्डन के उत्तर पर अनुवर्ती था। मैंने अपना उत्तर अपडेट कर दिया है।
स्टीफन चेज़लस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.