[sed][awk]カタカナをアルファベットに一撃置換する

[sed][awk]カタカナをアルファベットに一撃置換する

あるシステムの入力項目から入力されたテキストデータから、カタカナを強制的にアルファベット(ローマ字)へ変換したいという要件が出てきました。さすがにワンライナーでやるにはキツいので、sedの置換ファイルを作ってやるのが楽ですね。

s/キャ/kya/g
s/キュ/kyu/g
s/キョ/kyo/g
s/ギャ/gya/g
s/ギュ/gyu/g
s/ギョ/gyo/g
s/シャ/sha/g
s/シュ/shu/g
s/ショ/sho/g
s/ジャ/ja/g
s/ジュ/ju/g
s/ジョ/jo/g
s/チャ/cha/g
s/チュ/chu/g
s/チョ/cho/g
s/ヂャ/ja/g
s/ヂュ/ju/g
s/ヂョ/jo/g
s/ニャ/nya/g
s/ニュ/nyu/g
s/ニョ/nyo/g
s/ヒャ/hya/g
s/ヒュ/hyu/g
s/ヒョ/hyo/g
s/ビャ/bya/g
s/ビュ/byu/g
s/ビョ/byo/g
s/ピャ/pya/g
s/ピュ/pyu/g
s/ピョ/pyo/g
s/ミャ/mya/g
s/ミュ/myu/g
s/ミョ/myo/g
s/リャ/rya/g
s/リュ/ryu/g
s/リョ/ryo/g
s/ファ/fa/g
s/フィ/fi/g
s/フェ/fe/g
s/フォ/fo/g
s/ティ/thi/g
s/ディ/dhi/g
s/ヴァ/va/g
s/ヴィ/vi/g
s/ヴ/vu/g
s/ヴェ/ve/g
s/ヴォ/vo/g
s/ア/a/g
s/イ/i/g
s/ウ/u/g
s/エ/e/g
s/オ/o/g
s/カ/ka/g
s/ガ/ga/g
s/キ/ki/g
s/ギ/gi/g
s/ク/ku/g
s/グ/gu/g
s/ケ/ke/g
s/ゲ/ge/g
s/コ/ko/g
s/ゴ/go/g
s/サ/sa/g
s/ザ/za/g
s/シ/shi/g
s/ジ/ji/g
s/ス/su/g
s/ズ/zu/g
s/セ/se/g
s/ゼ/ze/g
s/ソ/so/g
s/ゾ/zo/g
s/タ/ta/g
s/ダ/da/g
s/チ/chi/g
s/ヂ/ji/g
s/ツ/tsu/g
s/ヅ/zu/g
s/テ/te/g
s/デ/de/g
s/ト/to/g
s/ド/do/g
s/ナ/na/g
s/ニ/ni/g
s/ヌ/nu/g
s/ネ/ne/g
s/ノ/no/g
s/ハ/ha/g
s/バ/ba/g
s/パ/pa/g
s/ヒ/hi/g
s/ビ/bi/g
s/ピ/pi/g
s/フ/fu/g
s/ブ/bu/g
s/プ/pu/g
s/ヘ/he/g
s/ベ/be/g
s/ペ/pe/g
s/ホ/ho/g
s/ボ/bo/g
s/ポ/po/g
s/マ/ma/g
s/ミ/mi/g
s/ム/mu/g
s/メ/me/g
s/モ/mo/g
s/ヤ/ya/g
s/ユ/yu/g
s/ヨ/yo/g
s/ラ/ra/g
s/リ/ri/g
s/ル/ru/g
s/レ/re/g
s/ロ/ro/g
s/ワ/wa/g
s/ヲ/wo/g
s/ン/n/g
s/ー/-/g

例えば大岡山(オオオカヤマ)をカタカナからローマ字に変換するにはこうします。

$ echo "オオオカヤマ" | sed -f katakana2alpha.sed
oookayama

先頭文字のみを大文字にするには、awkのワンライナーを使うと便利です。今回のワンライナーは py4s-tnk さんの一行パk・・・参考にさせていただきました。

$ echo "オオオカヤマ" | sed -f katakana2alpha.sed | awk '{print toupper(substr($1,1,1))substr($1,2)}'
Oookayama

上に貼り付けたコードをご覧いただけるとおわかりいただけるかと思いますが、2文字で発音する文字をファイルの最初に持ってきています。こうすることで、「貴社の記者は汽車で帰社した(キシャノキシャハキシャデキシャシタ)」をうまく変換することができます。

$ echo "キシャノキシャハキシャデキシャシタ" | sed -f katakana2alpha.sed
kishanokishahakishadekishashita

もしこの工夫がなければ・・・

$ echo "キシャノキシャハキシャデキシャシタ" | sed -f katakana2alpha.sed
kishiャnokishiャhakishiャdekishiャshita

このように、1文字目でマッチさせてしまうため、拗音があると無視されてしまうのです。拗音だけの変換テーブルを作ってやればいいじゃんという声もあるかも知れませんが、そもそも拗音だけ発音するという機会はないので作っていません。

どうしてもファイルを作りたくないという方はワンライナーでどうぞ。

$ echo "キシャノキシャハキシャデキシャシタ" | sed -e "s/キャ/kya/g;s/キュ/kyu/g;s/キョ/kyo/g;s/ギャ/gya/g;s/ギュ/gyu/g;s/ギョ/gyo/g;s/シャ/sha/g;s/シュ/shu/g;s/ショ/sho/g;s/ジャ/ja/g;s/ジュ/ju/g;s/ジョ/jo/g;s/チャ/cha/g;s/チュ/chu/g;s/チョ/cho/g;s/ヂャ/ja/g;s/ヂュ/ju/g;s/ヂョ/jo/g;s/ニャ/nya/g;s/ニュ/nyu/g;s/ニョ/nyo/g;s/ヒャ/hya/g;s/ヒュ/hyu/g;s/ヒョ/hyo/g;s/ビャ/bya/g;s/ビュ/byu/g;s/ビョ/byo/g;s/ピャ/pya/g;s/ピュ/pyu/g;s/ピョ/pyo/g;s/ミャ/mya/g;s/ミュ/myu/g;s/ミョ/myo/g;s/リャ/rya/g;s/リュ/ryu/g;s/リョ/ryo/g;s/ファ/fa/g;s/フィ/fi/g;s/フェ/fe/g;s/フォ/fo/g;s/ティ/thi/g;s/ディ/dhi/g;s/ヴァ/va/g;s/ヴィ/vi/g;s/ヴ/vu/g;s/ヴェ/ve/g;s/ヴォ/vo/g;s/ア/a/g;s/イ/i/g;s/ウ/u/g;s/エ/e/g;s/オ/o/g;s/カ/ka/g;s/ガ/ga/g;s/キ/ki/g;s/ギ/gi/g;s/ク/ku/g;s/グ/gu/g;s/ケ/ke/g;s/ゲ/ge/g;s/コ/ko/g;s/ゴ/go/g;s/サ/sa/g;s/ザ/za/g;s/シ/shi/g;s/ジ/ji/g;s/ス/su/g;s/ズ/zu/g;s/セ/se/g;s/ゼ/ze/g;s/ソ/so/g;s/ゾ/zo/g;s/タ/ta/g;s/ダ/da/g;s/チ/chi/g;s/ヂ/ji/g;s/ツ/tsu/g;s/ヅ/zu/g;s/テ/te/g;s/デ/de/g;s/ト/to/g;s/ド/do/g;s/ナ/na/g;s/ニ/ni/g;s/ヌ/nu/g;s/ネ/ne/g;s/ノ/no/g;s/ハ/ha/g;s/バ/ba/g;s/パ/pa/g;s/ヒ/hi/g;s/ビ/bi/g;s/ピ/pi/g;s/フ/fu/g;s/ブ/bu/g;s/プ/pu/g;s/ヘ/he/g;s/ベ/be/g;s/ペ/pe/g;s/ホ/ho/g;s/ボ/bo/g;s/ポ/po/g;s/マ/ma/g;s/ミ/mi/g;s/ ム/mu/g;s/メ/me/g;s/モ/mo/g;s/ヤ/ya/g;s/ユ/yu/g;s/ヨ/yo/g;s/ラ/ra/g;s/リ/ri/g;s/ル/ru/g;s/レ/re/g;s/ロ/ro/g;s/ワ/wa/g;s/ヲ/wo/g;s/ン/n/g;s/ー/-/g"

以上、sed awkの小ネタでございました。

[amazonjs asin=”477417369X” locale=”JP” title=”AWK実践入門 (Software Design plus)”]