awk正規表現で正規表現グループを参照する方法は?

awk正規表現で正規表現グループを参照する方法は?

awk正規表現で正規表現グループを参照する方法は?たとえば、正規表現グループがある場合は、(\w)後で同じ正規表現でそれらを参照するのですか(\w)\1? awkはこの機能をサポートしていますか?以下の例は機能しません。

# In this example, I want to change aa to aaa and cc to ccc.
echo ab aa cc de mn | gawk '{print gensub(/(\w)\1/, "\\1\\1\\1", "g")}'
# The result is: ab aa cc de mn
# The expected result is: ab aaa ccc de mn

ベストアンサー1

busyboxの実装awkは、私が知っている唯一の逆参照をサポートする実装です。と拡張もgawkサポートします。gensub()\w

sub()と同様に、標準では値が1()の文字であり、その文字と一致する必要がありますが、(まあ)代わりにおよび代わりに使用する必要がありgsub()ます。"..."/.../\\1\1awk"\1"^A/\1/"\\1"以前は) は POSIX では指定されません。また、POSIX EREには逆参照はありません。この機能はBREにはありますが、EREにはありません。

$ echo ab aa cc de mn | busybox awk '{print gensub("(\\w)\\1", "\\1\\1\\1", "g")}'
ab aaa ccc de mn

busyboxはサポートされawkていませんが、グローバリゼーション、ロケールに関係なく(と同じ)一致し、\wマルチバイト文字をサポートしません。a-zA-Z0-9_[[:alnum:]]

$ echo ee éé | busybox awk '{print gensub("(\\w)\\1", "\\1\\1\\1", "g")}'
eee éé

sed標準ユーティリティの場合、通常は作業に使用されます。

sed 's/\([[:alnum:]_]\)\1/&\1/g'

sed正規表現は次のとおりです。基本的な逆参照された正規表現をサポートします。一部のsed実装サポート拡大するPOSIXが標準の次のメジャーバージョンで指定するか、またはを含む正規表現はまだ参照を返しません(キャプチャリング-rグループの代替エントリが指定されていても)。 GNUとbusyboxは逆参照をサポートしていますが、FreeBSDはサポートしていません。-E-Essed-Esed

おすすめ記事