बैश रेगेक्स कैप्चर ग्रुप


22

मैं एक स्ट्रिंग से कई अल्फ़ान्यूमेरिक मूल्यों (यह संख्या भिन्न हो सकती है) को मैच करने की कोशिश कर रहा हूं और उन्हें बैश कैप्चर ग्रुप ऐरे में सहेज सकता हूं। हालाँकि, मुझे केवल पहला मैच मिल रहा है:

mystring1='<link rel="self" href="/unix//api/clouds/1/instances/1BBBBBB"/> dsf <link rel="self" href="/unix//api/clouds/1/instances/2AAAAAAA"/>'

regex='/instances/([A-Z0-9]+)'

[[ $mystring1 =~ $regex ]]

echo ${BASH_REMATCH[1]}
1BBBBBB

echo ${BASH_REMATCH[2]}

जैसा कि आप देख सकते हैं- यह मेरे लिए देख रहे पहले मूल्य से मेल खाता है, लेकिन दूसरा नहीं।


1
आप के उत्पादन पर पाशन के साथ सामग्री होगी echo "$mystring1" | grep -oE '/instances/([A-Z0-9]+)'?
जेफ स्कालर

4
संभवतः प्रसिद्ध का उल्लेख करने लायक आप regex पोस्ट के साथ HTML को पार्स नहीं कर सकते
डिजिटल ट्रामा

जवाबों:


22

यह शर्म की बात है कि आप बैश में वैश्विक मिलान नहीं कर सकते। तुम यह केर सकते हो:

global_rematch() { 
    local s=$1 regex=$2 
    while [[ $s =~ $regex ]]; do 
        echo "${BASH_REMATCH[1]}"
        s=${s#*"${BASH_REMATCH[1]}"}
    done
}
global_rematch "$mystring1" "$regex" 
1BBBBBB
2AAAAAAA

यह मिलान बंद उपसर्ग को स्ट्रिंग से काटकर काम करता है ताकि अगले भाग का मिलान किया जा सके। यह स्ट्रिंग को नष्ट कर देता है, लेकिन फ़ंक्शन में यह एक स्थानीय चर है, इसलिए कौन परवाह करता है।

मैं वास्तव में उस फ़ंक्शन का उपयोग किसी सरणी को पॉप्युलेट करने के लिए करूंगा:

$ mapfile -t matches < <( global_rematch "$mystring1" "$regex" )
$ printf "%s\n" "${matches[@]}"
1BBBBBB
2AAAAAAA

धन्यवाद- यह एक व्यवहार्य समाधान की तरह दिखता है- केवल मुद्दा मेफाइल है जो बैश 3.2 में मौजूद नहीं है ...
आर्थर लिसेंको


6

दूसरा सरणी मान प्राप्त करने के लिए, आपको regex में कोष्ठकों का दूसरा सेट रखना होगा:

mystring1='<link rel="self" href="/unix//api/clouds/1/instances/1BBBBBB"/> dsf <link rel="self" href="/unix//api/clouds/1/instances/2AAAAAAA"/>'

regex='/instances/([A-Z0-9]+).*/instances/([A-Z0-9]+)'

[[ $mystring1 =~ $regex ]]

$ echo ${BASH_REMATCH[1]}
1BBBBBB
$ echo ${BASH_REMATCH[2]}
2AAAAAAA

धन्यवाद, जो भी हो मैं एक अज्ञात संख्या में संभावित मैचों का मिलान करने के लिए देख रहा हूं।
आर्थर लिसेंको

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