bash 正则表达式多个匹配项

Ste*_*art 8 bash regular-expression

我有一个不错的小bash脚本,它解析正则表达式的消息并对捕获组执行某些操作:

regex='\((Closes|Resolves):\s([0-9]+)\)'
msg='Fixed a problem (Closes: 1234), (Resolves: 5678)'

if [[ $msg =~ $regex ]] ; then
  action="${BASH_REMATCH[1]}"
  issue="${BASH_REMATCH[2]}"
  do_something $action $issue
fi
Run Code Online (Sandbox Code Playgroud)

这适用于第一场比赛,但如果有多个比赛msg,后面的比赛将被忽略。有没有办法对我来说,遍历每场比赛或者是时候开始想着python还是perl

Ste*_*art 10

它没有被内置bash语法明确支持,但可以通过一些变量替换和一些递归轻松实现。

function do_something {
  echo $1 $2
}

function handlematches {
  regex='\((Closes|Resolves):\s([0-9]+)\)'
  msg=$1

  if [[ $msg =~ $regex ]] ; then
    action="${BASH_REMATCH[1]}"
    issue="${BASH_REMATCH[2]}"
    do_something "$action" "$issue"

    # Remove the first regex match and try again
    handlematches "${msg/${BASH_REMATCH[0]}/}"
  fi
}

message='Fixed a problem (Closes: 1234), (Resolves: 5678)'
handlematches "$message"
Run Code Online (Sandbox Code Playgroud)

输出:

Closes 1234
Resolves 5678
Run Code Online (Sandbox Code Playgroud)