sedは日暮れて:第3回 正規表現地の巻

さて今週もやってきました、sedは日暮れてのコーナーです。はたして本当にperlにまでたどり着けるんだろ~か?(^^;と茫洋たる未来に思いをはせてくらくらくらと眩暈さえ覚える今日この頃ですが。正規表現の不思議の国へ一緒に参りましょう、アリスたち。 

メタキャラクタのお話です。前回の終わりに書いた、変数として働く文字でしたね。基本は、

. * ^ $ [ ]

の6つです。上のはじめの文字はゴミではなくドットですので念のため(笑)もちろんこの他の文字もありますけれども、それは後の回になってひょっこり出てくると思いますのでよろしゅうに。ではこれらの文字の説明をば。

その1: . (ドット)
これは、DOSのワイルドカードでは「?」にあたるものです。つまり改行以外の任意の一文字を意味します。DOSではあんまりワイルドカードとして「?」を使わないですよね?でも正規表現ではよく使うんです、このドットを。同じ役目をするのにこの違いはなんだろ。その謎は次の項ではやくも解き明かされます。

その2: *(アスタリスク)
くせもの登場なり。ゆめ油断めさるな。なぜってこれは、DOSの*と似て非なるものですもの。DOSでは、*は、複数の文字の代わりであって。よくすべてのファイルを表現するのに「*.*」としたりしますよね。
でもでも正規表現では。*は、直前の文字の0回以上の繰り返しとなっちまうですだよ。え!違いがわかりにくいですって?そういうときは例だあ。

とにかく先頭がcである単語を表現したいとします。 DOSでは、「c*」でOKですよね。ちなみに、cではじまるファイル名、拡張子は何でもよいのならば、「c*.*」とするのは言わずもがなでしたか。

それが、正規表現の場合だと、「c*」とすると先頭にcがついているファイルもついていないファイルもぜ~んぶ指してしまうことになるのん。なぜなら、正規表現の*は、直前のcの0回以上の繰り返しすなわち「cがあってもなくてもいいぞ!」という意味になるからです。じゃあどうすればいいんでしょう?答えは、「c.*」というふうに、cの次に任意の一文字を表す「.」を入れておく。すると、「cの次に何か文字があったりなかったり(=.の0回以上の繰り返し)」となってcではじまる単語を指してくれるようになります。ほっ。

さっき前ふりした、ドットをよく使う謎というのは、このあたりにかかわってくるのでして。「.*」としてはじめてDOSの「*」と同じく任意の長さの文字を表わせるのようになるからでした。単独の*って使う意味がないのです。これってよく考えるとすごくない?正規表現の*は存在と非存在の両方を含んでるですもん。おお。これをもとに宗教とかつくれるんじゃないでしょうか?つくんないですけど(笑)

その3: ^(サーカムフレックス)
使い方というか、使う位置によって実は意味が2通りにわかれるのですが、ここでは まず、普通の使用法を書きます。^は、行頭という意味です。 「^、」だと行頭にきている「、」のことになります。

その4: $(ドル記号)
約100円。うそうそうそうそ。えと、上の^とちょうど反対で、行末のことです。「す$」とすれば、行のいっちゃん最後が「す」で終わっているものが探せますね。じゃあサーカムフレックスと組み合わせて^$とするとどうなるか。「行末が先頭である。」ふうむ。つまり、中味がなにもない(注:スペースさえも入ってない)空行ですね。

その5: [ ](ブラケット)
スヌーピーの仲間でライナスくんているでしょ?彼がいつも肌身離さずもっているものです。←それはブランケットでしょ~が!どもしっつれ~しました!(構想2日ギャグ)あんまりこんなことばっか書いていたら真剣に読んでもらえないかしら。しくしく。

ええと。本当の意味は中に入っている文字のどれかひとつにあてはまるということ。たとえば。日本語の格変化にこれを使えば便利。文章の中で、動詞の「歩く」をぜ~んぶ抜き出してしまいたいとき。歩の字だけ書いたら、名詞の「徒歩」とか「競歩」とか「歩のない将棋は負け将棋~」(笑)とかいらないのががんがん抜き出されてしまいます。ううう。

やはりここは。動詞だけのもつ性質を考えんといかあん!つまり。歩くは、5段活用でしょ、歩かない、歩きます、歩く、歩くとき、歩けば、歩け、歩こう。ああ。イ音便もあったぞ。歩いて。ということは。動詞では、歩の次にくる文字は、「い、か、き、く、け、こ」の6通りしかな~い。歩[いかきくけこ]とすればおおぶらぼお!あ。でもこれでも「徒歩か。ああしんど」というのが出てしまいますが(^^;話が深入りしすぎるのでここでは、更に精度をあげる話はやりませんです。ごめごめね。
まとめておくと。A[BC]は、AB、あるいはACという意味ですよん。

その6: (日本語キーボードでは円記号・英語ではバックスラッシュ)
約0.01ドル。←ってもういいってば。しつこいなあ(^^;。これは、エスケープです。正規表現でつかうメタキャラクタの意味をなくしちゃう記号です。

おれはこのドットを「任意の一文字」じゃなくて「ほんとおおおにほんとおおのドット、英語の文末に打つやつ」として書いてるんだよわかってくれよおお(;_;)と泣くかわりに、¥.と打ちましょう。すると、正規表現ならではの意味はなくなって、ただのドットになります。同様に、*も^も[ ]もその他ここに書いていないメタキャラクタも、そのすぐ前に¥をつければ、すべてメタじゃない普通の文字に戻してくれます。

以上、地の巻では大急ぎで主なメタキャラクタについて書きました。次回正規表現の最終回、人の巻はメタキャラクタの組み合わせの予定なり。ではではまた来週!ごきげんよう!

第4回

sedは日暮れて:第2回 正規表現天の巻

 正規表現でございます。私はまっくからパソコンをはじめたもので、正規表現ってなじみがなかったのですが、DOSユーザーの方々にとっては、ワイルドカードはおなじみのものですよね。釈迦に説法かなあと思いつつも孫悟空の冒険ははじまるのであった。天の巻です。 

正規表現とはなんぞや。あるものを選び出すのに、その名を直接個別にさし示すのではなく、その属性の規定によって選択をすることです。なんのこっちゃ。例をあげましょお。ファイル"hirasawa3.txt"というものがあったとして。そのなかみが以下のようなものだとします。

>more hirasawa3.txt 
>嵐の海
>バンディリア旅行団
>我が心の鷲よ月を奪うな
>ヴァーチュアル・ラビット
>UNDOをどうぞ
>山頂晴れて
>静かの海
>死のない男
>太陽の木
>ロシアン・トビスコープ

ちなみに、これらは何かというと。平沢進の傑作ソロ3rdアルバム「ヴァーチュアル・ラビット」(POCH-1084, 注:残念ながら絶盤のようです)に収録されている曲のリストです。ええ、趣味に走ってます(笑)すみません。
ちなみに例ですから短いものにしてます。実際には、sedなどをこんなに短いファイルに使用することはあまりないでしょう。エディタで書きなおす方が早かったりしますので。

この中から「ヴァーチュアル・ラビット」を含む行を抜き出したいとします。ヴァーチュアル・ラビットと文字列を正確に覚えているなら直接指定できますね。grep(指定した表現とマッチする1行を抜き出すユーティリティーです)で以下のように打てば、該当する行が出力されます。 
grep “ヴァーチュアル・ラビット” hirasawa3.txt

抜き出し結果は、
>ヴァーチュアル・ラビット
となります。

grepコマンドの使い方を簡単に書いておきます(実は、WINDOWSに
は"QGREPというフリーウェアがありまして、それを使えば、
DOSのコマンドラインで打ち込まずとも抜き出しをかけてくれるのですが)。

grep “抜き出したい文字列” 対象ファイル名 > 出力ファイル名

これで、抜き出したい文字列を含む行が出力ファイルに書き出されま
す。「> 出力ファイル名」を省略した場合は、標準出力、つまり画面に
結果が表示されることになります。 

話がわきにそれました。もとに戻ると。上記の場合と違って、正確にヴァーチュアル・ラビットと覚えていない場合はどうします?記憶があいまいだった場合。だって、ヴァーチャル・ラビット、バーチャル・ラビット、ヴァーチュアルラビットなど似たような言い回しがたくさんあるではありませんか。

この例ならば、ラビットだけで抜き出すという手もありますね。grepもsedもawkもその文字列だけでなく、その文字列を含む1行に関して働くものですので、結果は同じになります。

grep “ラビット” hirasawa3.txt
抜き出し結果は、やはり
>ヴァーチュアル・ラビット
の1行となります。

けれど。ラビットだけじゃあ余計な行まで抜き出してしまう危険がありません?この例ではないですよ。でも。もしかしてひょっとしてラビット関根という文字列が同じファイルの中に入ってるかもしれないじゃないですか?(そんなことありえんって?しつれ~しましたああ(^^;)

そんなときに、正規表現を使えば、直接なが~い文字列を指定することなしに、なおかつ正確にほしいものを選べます。簡単に言ってしまえば、変数を使うということですね。そうした、変数の役割をする記号のことをメタキャラクタ(特殊記号)といいます。んでもって正規表現をマスターするとはいかにこのメタキャラクタを使いこなせるかということなのです。

なが~い前置きは以上でおしまい。次回正規表現地の巻では、正規表現の眼目メタキャラクタについて書きます。じゃまた来週~!

第3回

sedは日暮れて:第1回 そもそものはじめ

さてはじめますか。といっても本編に入るまでにいくつか書いておきたいことがございます。第1回は前置きということで少しおつきあいいただければと存じます。 

まずはお断わりとお願いから。
こちとらUNIXにはじめてさわって1年足らずのど素人。慎ましやかな方であれば、このようなページを書こうなどとは思いもしないような身の上、さらに仕事で使っているとはいえ、あらゆる場面での使用を想定できるほどの広範な知識を持っているわけではございやせん。

したがって、ひょっとしたら書いている内容に偏りや誤りがあるかもしれません。そんなことがないよう、十重二十重に気をつけるつもりでありますが。 それでも。もし、読んでいらっしゃる方の中にsed の達人、awkのチャンピオン、perlの王様などがいらっしゃって何かお気づきになったことがございましたら、「何書いてんだよこの小娘が(関係ないが、私は背が高くてとても小娘とは言えないです(笑))。けっ」などというつめた~い視線で見たりせずにどうぞどうぞメールでお知らせください。お願いします。

また、環境としては、基本的にMS-DOSを想定しています。職場でそうだからというだけで深い意味はないです(^^;まっく愛してるよお。

次に、道具すなわち実際に使用する言語を揃える必要がありますね。
UNIXでは、これらの言語は付属していますが、DOSあるいはMacの場合は、天から降ってくるのを待つ必要があります。 さあ、雨乞いだ!嘘です(^^;本当は、サイトからゲットする必要があります。

sedがゲットできるサイト情報[96.10.25作成・99.09.07修正]

MS-DOS用sed.exe(LOGOS版)(LHA) 
http://www.vector.co.jp/soft/dos/util/se000880.html

すごくいろいろなプラットフォームにsedやgawkやgrepを移植された谷本孝浩さんのページ 
http://www.vector.co.jp/vpack/browse/person/an001702.html

Mac用SedMac(Macに移植された山下巌さんのページ) 
http://www.imasy.or.jp/~iwao/SedMac/SedMac.html 
道具が揃ったら、さっそく料理にとりかかりたいのですが。その前に(前置きばかり長くてすま~ん)どの言語をやるにも必要な、正規表現のおべんきょからはじめましょ。 第2回から正規表現の回を数回にわたってやります(^0^)
すでにあなたが正規表現のマイトレーヤ(笑)でいらっしゃるのならすっとばしていただいて結構です。

それでは。今宵はここまでにて。ご意見ご感想ご要望手助けをお待ちしていまあす! また来週!

第2回