[linux]シェルスクリプト文字コード判定
"yyyy年mm月..."みたいな文字列がShift_JISで書いてあったとして、iconv等使わないで判定する場合に、Shift_JISのバイト値を直接指定する方法。

バイト値指定

ざっと調べたところ、以下の2つの方法がある模様

  • 正規表現で、\x16進を使用する
  • bashの機能で、$'x16進'を使用する
    • 文字列全体をダブルクォートで囲むと動作しなくなる?

また、コード値は、"年"は94 4e、"月"は8c 8eのようです。

exprの場合

grepで試してみた所、以下の2点で挫折…。

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使った方が早い気がしてきます。