1234567890⇛ 1234567890 を実現する方法色々。
全角数字と半角数字の変換は、文字コードとか、何バイト文字とか意識してないと面倒なのですが。。。tr コマンドで出来そうで出来ないんですよね。
文字コードや、マルチバイト、その他のことを考慮すると候補となる手法は数種類ある。
とりえず、sed で
sed や vim の置換コマンドでやるなら、 y をつける。
echo 1234 | sed y/12345/12345/ 1234
だから、全部書くという大雑把な方法をとれる。
sed y/0123456789/0123456789/
もうね、覚えやすいし、思い出しやすいし、コレでいいんじゃないかと思うんだけど。
文字コードがUTF-8 決め打ちなんですね(OSXのBashやCygwinがUTF-8だから。)
nkf で全角⇛半角
nkf を使う方法をは、数字を変換するのに正統派の方法だと思う
echo 1234 | nkf -m0Z1 1234
しかも、これは文字コードが多少変わっても対応できる
echo 1234 | nkf -e | nkf -m0Z1 -w 1234
ワンライナーでやる
けど、これは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 が一番覚えやすい
sed で y
をフラグにして使うのが楽
echo 1234 | sed y/1234567890/1234567890/
ruby ワンライナー
ruby -ape '$_=$_.tr("0-9","0-9")'
ruby のワンライナーでやれば、 String#tr
が tr コマンドっぽいので使いやすかった。
範囲で指定できるので使いやすい。
参考資料
http://blog.livedoor.jp/maru_tak/archives/50699141.html