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
→萬など。