同様の問題に遭遇しましたが、パターンがより複雑だったため、問題を解決できませんでしたgsub。再帰関数とそのラッパーを書きました。1 つの変数で複数の一致を検出し、それらをスペースで区切って出力します。
awk '
function rec_wrap(str)
{
matches=""
return rec_func(str)
}
function rec_func(str2)
{
where=match(str2, /RE/)
if(where!=0) {
matches=(matches substr(str2, RSTART, RLENGTH) " ")
rec_func(substr(str2, RSTART+RLENGTH, length(str2)))
}
return matches
}
{print rec_wrap($1)}
' file.txt
rec_wrap変数を空にするにはラッパーが必要ですmatches。関数matchは、左端の一致の位置と長さを変数RSTARTandに書き込み、RLENGTH一致を抽出しsubstrて variable に追加しますmatches。次に、一致が見つからなくなるまで、関数rec_funcは残りの文字列str2をパラメータとして自分自身を呼び出します。match