シェルスクリプトで役立つテキスト文字列のパターンマッチングの基礎Beginner's Guide(4/5 ページ)

» 2009年01月06日 14時46分 公開
[Peter Seebach,SourceForge.JP Magazine]
SourceForge.JP Magazine

 キャラクタクラスの範囲指定にかんしては、主として英語圏の人間が見逃しがちな問題も隠されている。それは[a-z]という指定がアルファベットの小文字すべてに一致するとは限らないというもので、より厳密に言うと小文字以外にもマッチする可能性があるのだ。その本質的な原因は、この種の指定をする際の一般的な傾向として、アクセント付きのアルファベットを取り込んでいないASCIIのキャラクタセットを前提とすることにある。ASCIIの定義では、大文字および小文字のアルファベット群はどちらも連続した並びで配置されている(ただし両者の間には若干の記号類が置かれているため[A-z]というマッチングはそうした記号にも一致してしまう)。ところがUNIX系システムの場合、これらとは異なる配置が採用されている可能性があるのだ。

 いずれにせよ[a-z]という指定をすれば26あるアルファベットの小文字に一致するというのは汎用性のある一般的な想定と見なせるはずだが、アクセント付きのアルファベットまで考えた場合、このパターン指定にてマッチさせることはできない。さらにこの種の特殊なアルファベットには、汎用性のあるマッチング指定ができないどころか、その確認法すら存在しないのである。この種の問題の対処法としては、スクリプトを実行する個々の環境に応じてキャラクタセットの指定も変更するしかないと考えておくのが無難だろう。

 現状ではksh(pdkshを除く)やbashなどに限定される話だが、一部のシェルはPOSIXで導入されたそのほかのキャラクタクラスも追加サポートしている。それは[[:class:]]という指定法で、この中のclass部にはdigit、alpha、punctなどのキーワードを指定でき、これにより対応するCのisclass()関数でtrueが返される任意のキャラクタに対するマッチングが行えるのだ。

 例えば[[:digit:]]という指定は[0-9]に相当する。またこれらのクラスはほかの通常キャラクタと組み合わせることも可能で、例えば任意の数字とアルファベットに加えてアンダースコア記号(_)にも一致させたければ[[:digit:][:alpha:]_]と指定すればいい。これとよく似たものに、特殊なコレーティング(collating)シンボルとのマッチングを行う[.name.](地域や言語によっては、chといった特定アルファベットの組み合わせとそのほかのcとhが並ぶ場合とではマッチングとソーティングにかんする規則が異なるといった場合がある)、および特定の小文字とそこから派生したアクセント付き記号といった等価クラスに対するマッチングを行う[=name=]という規則がある。これらの規則は多国語対応のスクリプトを記述する際に便利なはずだが、現状では実際の移植性を確保できるほどの普及はしていない。いずれにせよこうした表記法が存在する以上、キャラクタクラス内部に置いた左角カッコの直後には、ピリオド(.)、等号(=)、コロン(:)を使わないように配慮しておくべきである。ただしこの制限が適用されるのはキャラクタクラスの開始を示す左角カッコではなく、その内部に置かれた左角カッコについてであり、例えば[.]はピリオドという記号そのものに対するマッチングとなる(特に正規表現の場合、こうした表記をしないピリオドは特殊記号の1つとして解釈される)。

 ここまで解説したように、シェルのパターンマッチングの中でも特に複雑な規則が適用されるのがキャラクタクラスである。

 シェルパターンは強力な機能である半面、キャラクタクラスに対する反復指定はできず、任意桁数の数値に対するシェルのパターンマッチングも行えないというように、さまざまな欠点も有している。またパターンの一部をオプション化する指定も不可能で、任意選択要素の指定法としてアスタリスク以上の機能は用意されていない。

新しいことをはじめる前には「Beginner's Guide」で知識を得てみませんか?


Copyright © 2010 OSDN Corporation, All Rights Reserved.

注目のテーマ