それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

コマンドで全角数字を半角数字(ascii char) を実現する方法(sed/ucov/ruby/phpなど)

1234567890⇛ 1234567890 を実現する方法色々。

全角数字と半角数字の変換は、文字コードとか、何バイト文字とか意識してないと面倒なのですが。。。tr コマンドで出来そうで出来ないんですよね。

文字コードや、マルチバイト、その他のことを考慮すると候補となる手法は数種類ある。

とりえず、sed

sedvim の置換コマンドでやるなら、 y をつける。

 echo 1234 | sed y/12345/12345/
1234

だから、全部書くという大雑把な方法をとれる。

sed y/0123456789/0123456789/

もうね、覚えやすいし、思い出しやすいし、コレでいいんじゃないかと思うんだけど。

文字コードUTF-8 決め打ちなんですね(OSXBashCygwinUTF-8だから。)

nkf で全角⇛半角

nkf を使う方法をは、数字を変換するのに正統派の方法だと思う

 echo 1234 | nkf -m0Z1
1234

しかも、これは文字コードが多少変わっても対応できる

echo 1234 | nkf -e |  nkf -m0Z1 -w
1234

ワンライナーでやる

rubyワンライナーでもできるnkf / kconv

けど、これはnkf 呼ぶから、ぶっちゃけNKFコマンドと変わらんね。

echo 1234 | ruby -r nkf  -ape '$_=NKF.nkf("-m0Z1 -w ", $_)'

kconv だって nkf のラッパーのはずだから、nkf でいいような気がする。

ruby の tr は賢い。tr コマンドよりもこっちほうが使える

echo 1234 | ruby  -ape '$_=$_.tr("0-9","0-9")'

tr コマンドは。。。

 echo 1234 | tr 0-9 0-9
993994995996

tr コマンドは char を前提に作られているので、 utf-8 なマルチバイト文字の前には、無力。残念。

phpワンライナーも結構賢い。

なんとはなく調べていたら、phpワンライナーって結構賢いな。今度から使うことも検討しよう。

echo 1234 | php -R 'echo mb_convert_kana($argn, "n", "utf-8")."\n";'
1234

php -R で ruby -ne と 全く同じですね。便利

uconv

brew install icu4c でインストール

echo AB129あア | uconv  -x Fullwidth-Halfwidth

uconv は半角カナが出てちゃうので不便。

結論 sed が一番覚えやすい

sedy をフラグにして使うのが楽

echo 1234 | sed y/1234567890/1234567890/

覚えやすさはsed、使いやすさで次点が、ruby

ruby ワンライナー

 ruby  -ape '$_=$_.tr("0-9","0-9")'

rubyワンライナーでやれば、 String#tr が tr コマンドっぽいので使いやすかった。 範囲で指定できるので使いやすい。

参考資料

http://blog.livedoor.jp/maru_tak/archives/50699141.html

http://6rats.blog62.fc2.com/blog-entry-115.html

module Kconv (Ruby 2.0.0)

2009-06-21