(2020-04-11 初稿 - 2020-08-18 転記・追記)
文字列もフォントによっては、カーニングがあってそもそも揃わないのでですが、等幅フォントで表示したときに全角と半角を考慮して文字幅を数えたいと思いました。
気休め程度にご覧ください。
なお、ここではUTF8の環境で、wcコマンドがある前提です。
ちなみに、文字数は以下のコマンドで得ることができます。
$ str="12345"
$ echo ${#str}
5
以下に示すスクリプトをzenhan_len等とし、chmod +x zenhan_lenで実行権を付与します。
IsZenkakuは、全角と半角を区別します。
ここでは、wc -cで3byteの文字種のうち、uFF61からuFF9Fを半角カタカナ(一部記号を含む)と判断させました。
Zenhan_lenは、IsZenkaku関数を用いて、文字の幅を合計します。
strにテストする様々な文字を入力して実行してみてください。
$ cat zenhan_len
IsZenkaku(){
local result=false
if [ $(echo -n $1 | wc -c) -gt 2 ]; then
if [[ $1 < $'\uFF61' ]] || [[ $1 > $'\uFF9F' ]]; then
result=true
fi
fi
echo $result
}
Zenhan_len(){
local charbyte=0
for((cnt=0; cnt < ${#1}; cnt++)); do
char=${1:$cnt:1}
if $(IsZenkaku $char); then
#echo $char
((charbyte+=1))
fi
((charbyte+=1))
done
echo $charbyte
}
str="aあ1aア1ウ" # ここを修正してテスト
num=$(Zenhan_len $str)
echo "文字のバイト数:" $num
EUCのときには、とても簡単だったと思ったのですが、UTFになってからかなり手こずりました。
もっとも、冒頭に述べたとおり等幅フォントを用いるとき以外には効果はありませんが… (^^ゞ
なお、複数行を一括して列幅を揃える場合には、columnコマンドを使った方法が便利です。
以下のページを参考にしてください。