同様の問題に遭遇しましたが、パターンがより複雑だったため、問題を解決できませんでした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
は、左端の一致の位置と長さを変数RSTART
andに書き込み、RLENGTH
一致を抽出しsubstr
て variable に追加しますmatches
。次に、一致が見つからなくなるまで、関数rec_func
は残りの文字列str2
をパラメータとして自分自身を呼び出します。match