ちょっとシェル芸botで遊んでいた際、ふと畳語(ワンワンとかドキドキとかムラムラ、ビンビン、ヌレヌレなど、反復する言葉)を抽出したり、置換するにはどうすればいいかなと思ったので、やってみることにした。 なお、grepやsedについては使用するのはGNU拡張されたものを用いるので、Mac OS Xに入っているgrepやsedでは同じことができないかもしれないので注意。

1.抽出する場合

GNU grepにはPerl正規表現を利用できるオプションがあるので、以下のように記述することで畳語を抽出できる。 (Perlの正規表現を使うことでunicode propertiesが利用できるようになるので、カタカナ/ひらがなの抽出が楽にできる)

grep -P '(\p{Katakana}{2,3}|\p{Hiragana}{2,3})\1'
blacknon@test-ubuntu:~$ echo オラ、ワクワクしてきたぞ | grep -Po '(\p{Katakana}{2,3}|\p{Hiragana}{2,3})\1'
ワクワク
blacknon@test-ubuntu:~$ echo ムラムラ学園 | grep -Po '(\p{Katakana}{2,3}|\p{Hiragana}{2,3})\1'
ムラムラ
blacknon@test-ubuntu:~$ echo ぬれぬれせんべい | grep -Po '(\p{Katakana}{2,3}|\p{Hiragana}{2,3})\1'
ぬれぬれ

Perlの正規表現を使わない場合、以下のようにする。

grep -E '([ぁ-ん]{2,3}|[ァ-ン]{2,3})\1'
blacknon@test-ubuntu:~$ echo わくわくしてたぞ! | grep -Eo '([ぁ-ん]{2,3}|[ァ-ン]{2,3})\1'
わくわく

2. 置換する場合

置換をする場合、perlを使うとunicode propertiesが利用できるので楽だ。

perl -C -ple 'use utf8;s/(\p{Katakana}{2,3}|\p{Hiragana}{2,3})\1/xxxx/g'
blacknon@test-ubuntu:~$ echo わくわくしてたぞ! | perl -C -ple 'use utf8;s/(\p{Katakana}{2,3}|\p{Hiragana}{2,3})\1/ムラムラ/g'
ムラムラしてたぞ!

sedで置換する場合、以下のようにする。

sed -r 's/([ぁ-ん]{2,3}|[ァ-ン]{2,3})\1/xxxx/g'
blacknon@test-ubuntu:~$ echo キュンキュンである!! | sed -r 's/([ぁ-ん]{2,3}|[ァ-ン]{2,3})\1/ムラムラ/g'
ムラムラである!!