正規表現マッチングからキャプチャグループの複数の項目を抽出するには?

正規表現マッチングからキャプチャグループの複数の項目を抽出するには?

一致する必要がある次の形式の文字列があります。

./foo/baz/bar/filename.c

私の正規表現は次のとおりです

  regex=$'^(\./)?([a-zA-Z0-9_-]+/)+([a-zA-Z0-9_-]+\.[a-z]+)$'

テストは次のとおりです

[[ $search =~ $regex ]]

存在するこれスレッドに興味深いコードがあります。コード例ユーザーの例グレンジャックマン同じキャプチャグループの繰り返し発生をキャプチャするには

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" 

しかし、正規表現には次のようなものがあります。一つキャプチャグループ。私のものここでは状況が少し異なります。

私の$ regexは、キャプチャグループの複数のエントリを抽出しようとします。ただし、キャプチャグループはゆっくりと処理され(またはここで正しい用語は何ですか?global matching)、最初の項目のみを出力します。他のすべては破棄されます。

$ printf "%s\n" "${BASH_REMATCH[@]}"
./foo/baz/bar/filename.c
./
bar/
filename.c

カッコをもう1つ追加しなければすべてのイベントが出力されますが、私が望む結果ではありません。

regex=$'^(\./)?(([a-zA-Z0-9_-]+/)+)([a-zA-Z0-9_-]+\.[a-z]+)$'

明らかにする

echo "${BASH_REMATCH[2]}"
foo/baz/bar/

BASH_REMATCH繰り返されるすべての項目が独自のインデックスによって格納されるように、上記のコード例や他のソリューションを適用する方法はありますか?

これにより、インデックスは次のように表示されます。

echo "${BASH_REMATCH[2]}"
./foo/baz/bar/filename.c
echo "${BASH_REMATCH[1]}"
./
echo "${BASH_REMATCH[2]}"
foo/
echo "${BASH_REMATCH[3]}"
baz/
echo "${BASH_REMATCH[4]}"
bar/
echo "${BASH_REMATCH[5]}"
filename.c

たぶん、1つのキャプチャグループしかない2つのパターンマッチングを実行する必要があります。回避策として。

関連情報