1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

シェルスクリプトで全角数字を半角に変換する

Last updated at Posted at 2022-03-04

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としてスペースをいれて、置換前文字列をずらしています

xyzABCとなるのは、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→萬など。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?