sedは日暮れて:第6回 魂の練習問題

いざゆかんsedの水面に帆を立てて。前回の復習です。

sed ”s/探す言葉/置換する言葉/” 対象ファイル > 出力ファイル

この構文でもってsedの基本、検索置換ができるようになりました。武器を持ったらがんがん使うべし。んでも文章の中の言葉の単なる検索置換はつまんにゃいのでちょっと使い方を変えてファイルの処理をしてみましょう。それは何かと尋ねたら。べんべん。大量のファイルをいっぺんに別のところにコピーしたり、移動させたいとき。バッチファイルをつくって一気にやらせちゃえますよね。そのバッチファイルつくりにsedがつかえます。

源氏物語のディレクトリgenjiがあって、その中に以下のファイルが納められているとします。

aoi.txt
hahakigi.txt
hananoen.txt
kiritubo.txt 
momijino.txt
sakaki.txt
suetumub.txt
utusemi.txt
wakamura.txt
yuugao.txt

これら10個のファイルをごっそり別のディレクトリにコピーしたい。別のディレクトリをgenjiと同じドライブの直下のworkディレクトリとします。

ファイルaoi.txtひとつだけで考えると、

copy aoi.txt workaoi.txt

という形にすればよいことがわかります(work.でもOKですね)。残りのファイルもみんなこの形にします。そんでもってこういう形がリストになったファイルをバッチファイル(~.bat)にすればいいわけです。手順は次の通り。

ファイルのリストを一つのファイルに納めます。
genjiというディレクトリにこれらしか.txtファイルがない場合
genjiディレクトリの下でls -1 *.txt > listとすれば、これらのファイルのタイトルが1行に1つずつ入ったファイルlistが作成されます。中を見てみると。
>more list
>
>aoi.txt
>hahakigi.txt
>hananoen.txt
>kiritubo.txt 
>momijino.txt
>sakaki.txt
>suetumub.txt
>utusemi.txt
>wakamura.txt
>yuugao.txt

となっています。

listファイルの中身をsedを使って書き換えます。
すべての行をcopy aoi.txt workaoi.txtのようにしたいんでしたね。目標となるcopyではじまる文をもういっぺんよ~く見て下さい。aoi.txt(注:ここは行によってsakaki.txtやutusemi.txtにかわりますね)が2回でてますね。これは新技を使わねば表現できません。どういうことかというと。1行全体の内容を表現し、かつそれをひとつの変数として別の場所で使える形にカプセル化するような正規表現を使う必要があるわけです。う~むとここで途方に暮れないで下さいね(;_;)難しい言い回しが好きなだけなの(^^;)。
形はかんた~ん。正規表現.*の周りを¥(と¥)で囲めばいいのだっ。つまり、(.*)としまあす。これは、1行に入っている文字が何であろうとそれを全部指すうえに、次回以降それらをまとめて変数1として表現させてくれる便利なやつなのです。

いよいよsed構文だい。対象ファイルはさっきのlistでした。結果ファイルは、そうですね、cptxt.batとでも名づけましょうか。ファイル名はそれこそ飯島愛でもちみもこのやろでも何でもOK(笑)ですが、拡張子だけは必ず.batにしないとばちがあたるぞお(^0^)
sed “s/(.*)/copy 1 work\1/” list >cptxt.bat

解説しますね。これは、listのすべての行に関して、
(.*)←1行ごっそりを、copy 1 work\1に変えろおと言っています。1は、(.*)のこと、つまり置換前の1行全体のことです。問題は、work\1ですね。このの大群はなんだろ。
は、エスケープ記号でした。つまり、直後のメタキャラクタの意味をなくす役割のメタキャラクタでしたよね。でも今回のはディレクトリをあらわすだけでその後の文字の意味をなくすとかなんとかいうメタな役割とは無関係です。だから、 を二つ重ねて、とし、「これは正規表現とは無関係なんだよ~ん」といわなくてはならないのだ。めんどくさいですが。workは、ふだんのworkのこと。その 後ろの\1は、ふつうののあとに、1がきているだけです。まとめておきますとsedの構文の中で、メタキャラクタとしてでないを使いたいな~と思ったら、その使いたい数より1つ多くをつけよう!ということです。で、変換結果を覗いてみましょう。

>more cptxt.bat
>
>copy aoi.txt workaoi.txt 
>copy hahakigi.txt workhahakigi.txt
>copy hananoen.txt workhahakigi.txt
>copy kiritubo.txt workkiritubo.txt
>copy momijino.txt workmomijino.txt
>copy sakaki.txt worksakaki.txt
>copy suetumub.txt worksuetumub.txt
>copy utusemi.txt workutusemi.txt
>copy wakamura.txt workwakamura.txt
>copy yuugao.txt workyuugao.txt

これで問題がなかったら、
>cptxt
と入力してこのバッチファイルを実行させます。10ファイルががんがんworkの下にコピーされるはずです。

今回のsedの用法は、copyで10ファイルを扱う程度でしたら、あまりありがたみがないかもしれませんが、rcp(リモートコピー)でたくさんのファイルのコピーをいったりきたりさせるときなどに非常に便利です。特に、UNIXとDOS間でコピーを繰り返すときなど、ファイル名がDOSだと短くなっちゃいますので、こうして自動的にやらせるようにすると、似通ったファイル名の混同もなくて安全ですねん。
今回はsedの簡単な検索置換の用例でした。次回はsedの別コマンドを扱う予定です。ではまた来週!(になればいいが(^^;) 

第7回

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

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