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
\1
awk
"\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
-E
s
sed
-E
sed