Bash正規表現キャプチャグループ

Bash正規表現キャプチャグループ

文字列内の複数の英数字の値を一致させ(これは異なる場合があります)、それを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]}

ご覧のとおり、私が探している最初の値と一致しますが、2番目の値は一致しません。

ベストアンサー1

残念ながら、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" 
1BBBBBB
2AAAAAAA

これは、次の部分が一致するように文字列から一致するプレフィックスを削除することによって行われます。文字列は破壊されますが、関数内ではローカル変数なので、誰が気にしますか?

実際、この関数を使用して配列を埋めます。

$ mapfile -t matches < <( global_rematch "$mystring1" "$regex" )
$ printf "%s\n" "${matches[@]}"
1BBBBBB
2AAAAAAA

おすすめ記事