sedは日暮れて:第4回 正規表現人の巻

うううう。すげえ間があいてしまってすみません。正規表現の最終回です。いろいろな正規表現の組み合わせについて。あそ~だ。始める前に前回の補足を少しだけ。

エスケープ記号の「¥」は、UNIXの「\」(バックスラッシュ)と同じです。DOSを想定しているので何の注釈もなしに書いてしまった。すまぬすまぬ。
さて本題。今回はいろいろな正規表現をがんがん挙げていきますね。

例題1:スペースしか入っていない行を探したい。どうしましょ。
まず。空行とスペースしか入っていない行とは異なるものということに気をつけましょおお。空行を表すのは、前回も書いたですが、^$ です。
スペースを表すには、実際にスペースキーを押せばいいです。スペースが1つ以上含まれるということで。(スペース).*ですね。
注:(スペース)ってのは、スペースを押すさまを表してるんであって、スペースっていう文字を入力しちゃいかんですよ。
これもまた前回の復習ですが、*は、その直前の文字の0回以上の繰り返しなんで、スペースが1個じゃだめ。2個にしてね。

例題2: 電話番号を抜き出したい。如何すればよいのかよいのか。
電話番号の構造を考えます。東京ならば、

03-3xxx-xxxx 
03-5yyy-yyyy

のどっちかですよね。03と-は両方共通だから、正規表現使わずそのまま表しましょう。問題は、xとyの部分にあてはまる数字ですね。0から9までのどれかが入るのだから、前回やったブランケットじゃなかった(笑)、ブラケットを使いましょう。ブラケットの中に文字を入れると、そのどれかになるんでしたね。
[0123456789]とすると、0から9までの数字のひとつという意味になります。でも長くて打つのがめんどくさい。実は、数字とアルファベットには、次の表現法があるのだ。

[0-9] 0から9までのどれか1つの数字
[a-z] 小文字のaからzまでのどれか1つの文字
[A-Z] 大文字のAからZまでのどれか1つの文字

これで答がでるぞ。 東京の電話番号は、
03-[35][0-9][0-9][0-9]-[0-9][0-9][0-9][0-9] ですねん。

[35]は3か5かどっちかという意味ですので念のため。できたぞおお。と安心してちゃだめなのだ。電話番号表記には、次のようなものもありましたぞよ。

03(3xxx)xxxx

さっきの表記と違う点はどこだ。「-」の代わりに「(」と「)」が入った点ですね。さっきのと今度のと両方を表せる正規表現考えましょう。答えはこれだい。

03[-(][35][0-9][0-9][0-9][-)][0-9][0-9][0-9][0-9]

でした。さらに余力のある方は、全国の電話番号も考えてみるとおもしろいぞお。

例題3: 今度は、ある文字を含まない行を探してみたい。ひねくれてますか?(笑)
いや、全然ひねくれてないです。そういうケースのための正規表現もございます。
ブラケットとサーカムフレックス^を併用します。サーカムフレックスって普通に使ったら、行頭という意味でしたわね。それが、ブラケットの中の一番先頭に置くと、意味が変わっちまうんですのよ。あ以外を抜き出したいなら。[^あ] とする。おお新しい用法なり。数字以外だったらば。[^0-9]ですし。アルファベットと数字以外だったら。[^0-9a-zA-Z]となります。

ということで今回は実際に使いそうなケースの一部をとり出してみました。これ以外のものも、 sedの中で説明してゆきますねん。では。来週からやっとsedのコマンドに入ります。次回第5回 command garbled! をお楽しみに!ではまたらいしゅ。

第5回

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回

インド経営大学院でマーケティング研修。

去年の10月にコルカタ(カルカッタ)にあるインド経営大学院(IIM。校舎がインド各地にあり、地名の頭文字を最後につけてIIMA(アーメダバード校)などと呼ばれます。コルカタの場合はIIMC)で社会人向けマーケティング研修を受けてきました(公式サイト)。どんだけ更新が遅いんや、という感じですが(汗)、そのとき撮った写真をアップしておきます。

キャンパスはとても広い(大きな池などもあって緑も豊か)のですが、今回の研修が行われたのはその一角にあるTATA HALL。宿泊施設・ホール・教室・食堂などがあり、この建物内で研修生活のすべてが行われます。

IIMC2

TATA HALLの中庭はこんな感じ。

IIMC8

これはTATA HALLの中の宿泊エリア(ひとり部屋)。建物は年季が入っているのですが、エアコン完備&清潔で快適でした。ポット入りのチャイと新聞が毎朝配られます。

IIMC9

教室。日本のとあまり変わりないです。研修内容はMBAなどと同様、ケースを元に議論するというものでした。ひとりものすごく鋭い教授の方がいて(見た感じごく普通の気のいいインドの人にしか見えなかったのですが)感動しました。あの先生の授業は次もぜひ受けてみたい。また、参加している日本人がひとりだったので、いろいろ引き立てようとしてくれる気遣いもありました(でも無理やり懇親会で日本の歌を歌わせようとするのはやめて…平沢進とか歌うしか…)。

IIMC7

夜は時間があったのでキャンパス内を散歩したりしていました。写真は夜の図書館(深夜まで開いています)。日本語フォントインストール済のPCがあって、そこからTwitterしていましたよ。学生さんに「どこの国の人?」と話しかけられたりも。

IIMC5

たった数日間の滞在でしたし、TATA HALLの中だけですべてが完結していたので、IIMの凄みなどについてまだまだわかっていないと思うのですが、楽しい体験でありました。また違うプログラムで行けたらいいなあと考えています。

インドのこわすぎるサーカス。

インド暮らしも1年を越え、のほほんと暮らしていたある日のことぢゃった。いきなり近所の空き地にテントが現れた!

African Circus in India4

近寄ってみると、どうやらサーカスらしい。1日3公演、1時・4時・7時30分と書いてあります。

African Circus in India11

…でもどうにも看板がこわい。

African Circus in India13

African Circus in India12

African Circus in India7

インドの子供たちは本当にこれを楽しむのか?こわくないのかー?

African Circus in India8

African Circus in India18

African Circus in India17

看板を見ているうちにピエロに誘拐されそうでこわくなったので自分は中に入れませんでした。他の写真はこちらからどうぞ。