Art*_*nko 35 bash regular-expression
我正在尝试从一个字符串中匹配多个字母数字值(这个数字可能会有所不同),并将它们保存到一个 bash 捕获组数组中。但是,我只得到第一场比赛:
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]+)'
[[ $mystring1 =~ $regex ]]
echo ${BASH_REMATCH[1]}
1BBBBBB
echo ${BASH_REMATCH[2]}
Run Code Online (Sandbox Code Playgroud)
如您所见 - 它与我正在寻找的第一个值匹配,但与第二个值不匹配。
gle*_*man 36
很遗憾你不能在 bash 中进行全局匹配。你可以这样做:
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"
Run Code Online (Sandbox Code Playgroud)
1BBBBBB
2AAAAAAA
Run Code Online (Sandbox Code Playgroud)
这是通过从字符串中切掉匹配的前缀来实现的,以便可以匹配下一部分。它破坏了字符串,但在函数中它是一个局部变量,所以谁在乎。
我实际上会使用该函数来填充数组:
$ mapfile -t matches < <( global_rematch "$mystring1" "$regex" )
$ printf "%s\n" "${matches[@]}"
1BBBBBB
2AAAAAAA
Run Code Online (Sandbox Code Playgroud)
Jef*_*ler 11
要获得第二个数组值,您需要在正则表达式中有第二组括号:
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
Run Code Online (Sandbox Code Playgroud)