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)