Alfredのワークフローなどで、スクリプトにzshをはじめました。初心者用にメモを残します
シェルスクリプトで全角数字を半角に変換する
sedコマンドで1対1変換が可能
書式
sed 'y/変換前文字列/変換後文字列/'
※1文字単位での変換となります
変換前文字列の1文字目が、変換後文字列の1文字目に変換
変換前文字列の2文字目が、変換後文字列の2文字目に変換
変換前文字列の3文字目が、変換後文字列の3文字目に変換
1体1置換えなので、見た目ですぐわかります
よくある例では、0から9や、aからzなど順番通り書くものが多いのですが
もちろん下のような逆順でもOKです
echo 3月5日 | sed 'y/9876543210/9876543210/'
#=> 3月5日
雑談
1対1変換なので、カエサル暗号にも利用できますねと思って調べたら
trコマンドの例がありました
echo aBCdEfg | tr "$(printf %3sA-z)" A-zA-z
#=> dEFgHij
ん、3文字ずらしですが、お尻の方がへんですね
echo vwxyzVWXYZ | tr "$(printf %3sA-z)" A-zA-z
#=> yzABCYZ[\]
この例は、もともと○字ずらしという汎用的な暗号装置を考えているようです
%○Sとしてスペースをいれて、置換前文字列をずらしています
xyzがABCとなるのは、A-zA-zの後ろのABCにヒットしているので
作者の想定通りかどうかはわかりませんが、動きとしては合っています
ただ、XYZが[\]となるのが奇妙
文字コードをみてみると
大文字がA(&H41)からZ(&H5a)です。
確かにこの後のコードは[(&H5b)、\(&H5c)、](&H5d)となっています
小文字はa(&H61)からz(&H7a)ですね
もうおわかりですね
A-zというのは、A(&H41)からz(&H7a)までの範囲なので
当然、非英文字(&H5b)から(&H60)も入るのですね
結局1文字ずつ対応させる必要があるので、3文字ずらしであればこうなります
(英大文字、英小文字のみ対応となります)
echo ABYZabyz | tr A-Za-z D-ZA-Cd-za-c
#=> DEBCdebc
trコマンドでは変換文字列をまとめて書けることがわかったので、
はじめの全角数字を半角にするとこんな感じ
echo 3月5日 | tr 9-0 9-0
#=> 3月5日
あれれ、小さいものから書かないといけないのですね
3月5日 | tr 0-9 0-9
#=> 3月5日
わかったこと
trコマンドの範囲指定A-zには非英字も含まれます
trコマンドの範囲指定はD-Zでも可能、逆順Z-Aは不可
もうひとつ、別の変換の話題を
数字を漢数字の大字に変換する場合は感じかな
sed 'y/0123456789/零壱弐参肆伍陸漆捌玖/'
あ、2桁変換ができないか。10→拾、20→廿、10000→萬など。