■
[linux]シェルスクリプトで文字コード判定
"yyyy年mm月..."みたいな文字列がShift_JISで書いてあったとして、iconv等使わないで判定する場合に、Shift_JISのバイト値を直接指定する方法。
バイト値指定
ざっと調べたところ、以下の2つの方法がある模様
また、コード値は、"年"は94 4e、"月"は8c 8eのようです。
exprの場合
grepで試してみた所、以下の2点で挫折…。
- 正規表現で16進表記ができない
- 量指定子を使用する場合に、パターン全体をダブルクォートで囲まないとダメみたい。
exprは、パターンをダブルクォートで囲まなくても良いので、まずはこちらで確認。
以下の方法で対応。
#!/bin/bash expr $target : [0-9][0-9][0-9][0-9]$'\x94\x4e'[0-9][0-9]$'\x8c\x8e'.*
本当は、月の指定を(0[1-9]|1[0-2])等にすべきだとは思いますが、そこは本題でないので割愛。
egrepの場合
その後の調査で、シングルクォートで囲んだ文字列なら連結できる事が判明。
以下の方法で対応出来ました。
#!/bin/bash echo $target | egrep -q '[0-9]{4}'$'\x94\x4e''[0-9]{2}'$'\x8c\x8e''.*'
回数指定はできますが、かえって見づらい?
exprを使った年月の切り出し
2009-08-08追記:bashのパラメータ展開いろいろ - 総天然色頁の内容を踏まえて修正
#!/bin/bash x=`expr $target : '\([0-9][0-9][0-9][0-9]'$'\x94\x4e''[0-9][0-9]\)'$'\x8c\x8e''.*'` if [ ! -z $x ]; then exit 1 fi yyyy=${x:0:4} echo $yyyy mm=${x:6:2} echo $mm
ここまで来るとPerl使った方が早い気がしてきます。