Develop and Download Open Source Software

OpenSource Downloads

7-Zip  (4,014)  
HandBrake Japanese Language Version  (2,964)  
CrystalDiskInfo  (1,714)  
Boookends  (1,269)  
CrystalDiskMark  (874)  
Tera Term  (825)  
CotEditor  (626)  
FFFTP  (593)  
えこでこツール  (532)  
10  ffdshow  (524)  
11  SMPlayer  (503)  
12  Cabos  (492)  
13  ギコナビ  (475)  
14  Rappelz Server  (471)  
15  MergeDoc  (457)  
More >>

最近ブックマークされた記事

シェルスクリプトで役立つテキスト文字列のパターンマッチングの基礎

2009年01月06日 10:25 Peter Seebach 1 2 3 4 5

 キャラクタクラスの範囲指定に関しては、主として英語圏の人間が見逃し勝ちな問題も隠されている。それは[a-z]という指定がアルファベットの小文字すべてに一致するとは限らないというもので、より厳密に言うと小文字以外にもマッチする可能性があるのだ。その本質的な原因は、この種の指定をする際の一般的な傾向として、アクセント付きのアルファベットを取り込んでいないASCIIのキャラクタセットを前提とすることにある。ASCIIの定義では、大文字および小文字のアルファベット群はどちらも連続した並びで配置されている(ただし両者の間には若干の記号類が置かれているため[A-z]というマッチングはそうした記号にも一致してしまう)。ところがUnix系システムの場合、これらとは異なる配置が採用されている可能性があるのだ。いずれにせよ[a-z]という指定をすれば26あるアルファベットの小文字に一致するというのは汎用性のある一般的な想定と見なせるはずだが、アクセント付きのアルファベットまで考えた場合、このパターン指定にてマッチさせることはできない。更にこの種の特殊なアルファベットに関しては、汎用性のあるマッチング指定ができないどころか、その確認法すら存在しないのである。この種の問題の対処法としては、スクリプトを実行する個々の環境に応じてキャラクタセットの指定も変更するしかないと考えておくのが無難だろう。

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

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

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

最終更新:2009年03月08日 17:07