বাশ রেজেক্স ক্যাপচার গ্রুপ


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
সম্ভবত বিখ্যাতটি উল্লেখ করা ভাল আপনি রেজেক্স পোস্টের সাথে এইচটিএমএল বিশ্লেষণ করতে পারবেন না
ডিজিটাল ট্রমা

উত্তর:


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

দ্বিতীয় অ্যারের মান পেতে, আপনার রেজেজেসে প্রথম বন্ধনীর দ্বিতীয় সেট থাকা দরকার:

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
আমি আপনার প্রশ্নটিকে উত্সাহিত করেছি কারণ আমি একাধিক ম্যাচ অ্যারেতে যাওয়ারও প্রত্যাশা করেছি, তবে বাস্তবে আপনার কাছে একাধিক সেট বন্ধনী না থাকলে এগুলি মনে হয় না।
জেফ শ্যাচলার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.