Bash Regex Capture Group
Answer :
It's a shame that you can't do global matching in bash. You can do this:
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
This works by chopping the matched prefix off the string so the next part can be matched. It destroys the string, but in the function it's a local variable, so who cares.
I would actually use that function to populate an array:
$ mapfile -t matches < <( global_rematch "$mystring1" "$regex" ) $ printf "%s\n" "${matches[@]}" 1BBBBBB 2AAAAAAA
To get the second array value, you need to have a second set of parentheses in the regex:
mystring1='<link rel="self" href="/api/clouds/1/instances/1BBBBBB"/> dsf <link rel="self" href="/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
Comments
Post a Comment