bash正規表現マルチマッチ

bash正規表現マルチマッチ

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

これは、最初の一致に適していますが、一致する項目が複数ある場合、後続のmsg一致は無視されます。各ゲームを循環する方法はありますか?それとも今考え始める時間pythonですかperl

ベストアンサー1

組み込み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"

出力:

Closes 1234
Resolves 5678

おすすめ記事