sedは日暮れて

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



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

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

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

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

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

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


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

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

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

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

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


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

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

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

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

第3回


引用元:sedは日暮れて:第2回 正規表現天の巻 - Retroengine





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は日暮れて:第3回 正規表現地の巻 - Retroengine

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は日暮れて:第4回 正規表現人の巻 - Retroengine

sedは日暮れて:第5回 COMMAND GARBLED!



こんばんは。「彼女のCOMMAND GARBLED!によってげげげえとなったsedの花嫁、さえも」の時間です。パタフィジックな旅に出ましょう。おのおのがた。 

sedとは、簡単に言えば、検索置換をコマンドラインで一発でやってしまうものです。普通の量のテキストを扱うならば、検索置換は、秀丸やWordやelisやmifesやその他エディタ、ワープロ等でできてしまうことなので、必要ないと言えましょう。

だがしかし。だがしか~し。ひとつひとつは短いとはいえ、200もの文書の中の表記を全部変えてしまいたいとなったらいかがせん。そういう賽の河原/シジフォス的所業って聞いただけでくらくらしてきません?だってファイル開くだけでめんどくさいじゃ~ん。

そういうときに自動的に置換してくれるのがわれらがsedでございます。さあさっそく基本構文だああ。

sed (オプション)"(コマンド)" 対象ファイル > 出力ファイル

この構文で気づいてほしいことが1点。出力ファイルをリダイレクト(>)していることです。sedで行う置換の結果というのは、オリジナルのファイルにそのまま上書きされるんではないのだ。つまり、別の結果ファイルを作るということですね。ちなみに「> 出力ファイル」を省略すると、画面にだだだだあと結果が出てしまって、はいそれまでよ、なので(;_;)ちゃんとリダイレクトして保存しましょう。

オプションはおまけなのでなくてもよろし。あってもよろし。"~"の中のコマンド部分はいろいろあるので次回以降解説してゆきます。

今回は美中の美、じゃなかった渦中の蚊でもない、基本中の基本をやるぞお。準備はいいか。歯をくいしばれっ!ちと違いますね(^^;

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

この文が何を言っているか通訳してみるあるね。「探す言葉を対象ファイルの中から見つけだしてそれを置換する言葉に変えてしまった後、結果をあますことなく出力ファイルの中にぺっぺっと吐き出しやがれ」でした。んまっ。ちと通訳の方がお下劣だったようですわよ。って自分なんですが(^^;

sedコマンドの「s」を使っています。これは"s/A/B/“の形で、「AをBに置換せよ」という意味になるコマンドです。私なんかよく、Bのあとの「/」を忘れてしまってsedに叱られてしまいます。お叱りの言葉が、今回の標題の「COMMAND GARBLED!」なんです。これは構文のミスを教えてくれる言葉なのん。でもどこかにミスがあると言うだけ(笑)。なげ~え構文だとどこが間違っているか探すのが一苦労なんですよお。「間違ってるで~」というだけではなしにどこが間違っているかびしっ!と教えてくれたらいいのにね。ふるるう。

それはともかく、前回までの正規表現と、今回の基本の構文をマスターするだけで、もうかなりのことができるようになったですよ。次回はその例と他のコマンドの話をやりますね。ではまた来週!

第6回


引用元:sedは日暮れて:第5回 COMMAND GARBLED! - Retroengine

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 \work\aoi.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 \work\aoi.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 \work\aoi.txt 
>copy hahakigi.txt \work\hahakigi.txt
>copy hananoen.txt \work\hahakigi.txt
>copy kiritubo.txt \work\kiritubo.txt
>copy momijino.txt \work\momijino.txt
>copy sakaki.txt \work\sakaki.txt
>copy suetumub.txt \work\suetumub.txt
>copy utusemi.txt \work\utusemi.txt
>copy wakamura.txt \work\wakamura.txt
>copy yuugao.txt \work\yuugao.txt

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

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

第7回


引用元:sedは日暮れて:第6回 魂の練習問題 - Retroengine

sedは日暮れて:第7回 ちかんのおしり



こんばんは!sedの夜明けはちかいぞ龍馬くん。というわけでちかんのおしりをはじめましょ(^0^)

sedの別コマンドのお話にうつる前に、置換でやっておきたいことがまだいくつかありました。今回はフラグ、次回にスクリプトファイルについて書きます。さっそくフラグに突入でい。

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

この構文で置換の基本はできるようになったですが、実は、これだけでは対処できない置換があります。例えば。次の3行だけが入っているファイル sample.txtで。

例1: ほにゃらげのぽぽ。 例2も参照のこと。
例2: せったくれのとと。
例3: さーとーますりぷとん。 例1、例2も参照のこと。


例というのをExampleに置換したいとして、sedを使いますと。

>sed “s/例/Example/” sample.txt
>
>Example1: ほにゃらげのぽぽ。 例2も参照のこと。
>Example2: せったくれのとと。
>Example3: さーとーますりぷとん。 例1、例2も参照のこと。


という結果になってしまいます。2番目に一致しているはずの部分が「例」という言葉のままになってて「Example」に変換されていな~い(;_;)
というのもいっちゃん最初に見つかったものしか変換してくれないのがsedの特徴なんですのよほほほ。したがって、検索置換したい言葉が1行に複数出てくるとあらかじめわかっている場合は、構文におまけをつけ加える必要があります。 そのおまけをフラグ(flag)といいます。構文を修正しますと。

sed ”s/検索する言葉/置換する言葉/フラグ” 対象ファイル > 出力ファイル

フラグのうち使えそうなもの2つの説明をば。えいやっ。


g
ウは宇宙船のウ。gはglobalのgです。探す言葉が1行の中にいくつ入ってようとそれをぜ~んぶ置換しようという意味。 
n
n=1~512。1行中で何番目に出てきた検索語を置換するかを決めます。デフォルトの状態ではn=1ということになりますね。
さてさっきのファイルsample.txtで実験しようそうしよう。 まずはぐろーばる。

sed “s/例/Example/g” sample.txt

結果は、

Example1: ほにゃらげのぽぽ。 Example2も参照のこと。
Example2: せったくれのとと。
Example3: さーとーますりぷとん。 Example1、Example2も参照のこと。

お次はn。ここではn=2としてみると。

sed “s/例/Example/2” sample.txt


結果は以下のとおり。2番目に一致した部分しか置換されません(^0^)

例1: ほにゃらげのぽぽ。 Example2も参照のこと。
例2: せったくれのとと。
例3: さーとーますりぷとん。 Example1、例2も参照のこと。


以上置換コマンドのおしり(最後)にくっつけるフラグのお話でしたよん。 ではまた来週スクリプトファイルの巻でお会いしましょうね。

第8回


引用元:sedは日暮れて:第7回 ちかんのおしり - Retroengine

sedは日暮れて:第8回 異星の客



さあゆこう!sedの世界にハインライン。←おやじぎゃぐかも(^^;)

コマンドラインの直線の世界を2次元に広げてくれるありがたいファイルがスクリプトファイルです。おおなんだかアボット『多次元☆平面国』(東京図書)みたい。ラインランドからフラットランドへ。

私は最初スクリプトファイルの存在を知らずにsedの文をぜ~んぶコマンドラインで打ち込んでおりまして。うううう。聞くも涙、語るも涙さくりもよよの辛苦でございました。この悲劇を決して繰り返させるまじ!とここにでででんとスクリプトファイルのお話をするものであります。ごっほん。


sed -f スクリプトファイル 対象ファイル > 出力ファイル
ああいきなり構文が出てきました。気がはやいんだからもう。前回までの構文と変わっているところを探しますと。-fオプションとスクリプトファイルが加わっていて、”s/検索する言葉/置換する言葉/フラグ”というのがなくなっているのですね。まずオプションからご説明をば。sedのオプションは、以下の通り。


-f
このあとにスクリプトファイルがくるからねええという前ぶれ 
-e
このあとにくるのは命令だからねええという前ぶれ 
-n
入力行をぜ~んぶ自動出力するのはやめい!というオプション 
-nを使うケースってすごく稀だと思われるので、今回やるのは、上ふたつのオプションのみにします。で例によって例のごとく例。テキストファイルsample2.txtの中身が次のようなものだとします。

例1: はんにばるかにばるれくた。 例2も参照のこと。
例2: じょおでえほぉすた。
例3: だるぐりっしゅとこおでりあ。 例1、例2も参照のこと。

このファイルの中で、「例」をExampleに、さらに、「参照のこと」を「参照してください」に変えたいとします。前回までのやり方だと、

sed “s/例/Example/g” sample2.txt > pppp

として、Exampleに変換されたファイルを一旦作業ファイルppppの中に納めたうえで、さらにそのppppファイルに対して、

sed “s/のこと/してください/” pppp > kekka.txt

と打ち込んで最終結果ファイルkekka.txtを作る必要があります。2段階必要なわけですね。
でもこれをいちいちやってたらしんど~いめんど~い。ふふふふふ。実は簡略するやり方があります。さっきのスクリプトファイル呼び出しの-fはほんのちょっとだけこっちに置いといて、先に-eを使ってみましょう。

sed -e “s/例/Example/g” -e “s/のこと/してください/” sample2.txt > kekka.txt

です。ひとつひとつの命令の前に、-eを置くことで、2つの命令を1行で表現できました。お~め~で~とおおお(^0^)

がこれにしても、なが~い1行をミスタイプなしに一気呵成に(って別に速度が問われるわけではないですが(^^;)打ち込まなければならないことには変わりはありません。でもでも。スクリプトファイルなら。エディタを使ってゆっくり編集ができます。今と同じことをスクリプトファイルでやってみましょう。


エディタを起動して、次の2文を打つ。1行にひとつの命令。
s/例/Example/g
s/のこと/してください/


その2文のおさまったテキストファイルに名前をつけて保存。ここではscriptという名にしましょう。

コマンドラインで、次のようにsedの文を打つ。
sed -f script sample2.txt > kekka.txt

これでおしまい。簡単になりましたでしょおお?
-fでscriptの中身を呼び出して、それを1行ずつ“~”の中身に入れてくれているのですねん。正規表現のミスなんかで、sedを失敗した場合も、スクリプトファイルの中身だけ入れ換えればいいだけでいちいちなが~~い文を打たなくてすむため、非常に楽です(^0^)
もちろん、スクリプトファイルは、sedの置換コマンドだけでなく、他のコマンドの場合にも使用できます。
というわけで、今回で置換コマンドのお話はおしまい。次回から、sedの別 コマンドについて解説してゆきます。ではではあまたらいしゅうううう。

第9回


引用元:sedは日暮れて:第8回 異星の客 - Retroengine

sedは日暮れて:第9回 住所指定



sedもいよいよ肉詰めピーマンじゃなかった大詰めの段階に入ってまいりました。今回は置換以外のコマンドを扱うのに必須のアドレスの話です(検索置換の場合でも使用しますが)。

アドレスって一体何かといえば、行指定のことなんです。

あれ一言で終わっちゃったい。 それじゃあんまりなのでもう少し詳しく。アドレスには、行アドレスとパターンアドレスの2種類があります。おしまい。

こんなところで終わるなっちゅ~に。え~っと。前回までの検索置換 のお話のなかではアドレスは指定しておりませんでした。というのは、検索置換をすべての行に適用したかったからです。ぜ~んぶの行の中から探して置換せよ!と言っていたからですね。それが、アドレスを指定すると、地域限定となるですよ。

つまり。行アドレスだと、何行目だけにコマンドを適用しなさいという、行番号を指定します。それ以外の行をsedは無視します。一方、パターンアドレスだと、そのパターン(正規表現や文字列などで指定)がある行だけにコマンドを適用しなさいということになります。

アドレスは、sed構文の中ではコマンドのすぐ前に置きます。 では例をあげて~いこ~~よお。
こんなファイルsample.txtがあったとさ。

千葉・船橋市
千葉・柏市
東京・江東区


検索置換で千葉のあとの・を県にしたいとき。パターンアドレス指定だと、こういう文になります。

sed “/千葉/s/・/県/” sample.txt

置換コマンドのsの前に、/千葉/をつけ、「千葉という文字列が入っている行だけで、・を県に変えなさい!」と言っているわけです。パターンアドレス指定の場合は、前後をスラッシュ(/)で囲むことに注意!

行指定だと、変換したいのは、1行目と2行目ですので、

sed “1,2s/・/県/” sample.txt

となります。カンマ(,)を行番号の間に置き、1行目から2行目までという意味にしています。ちなみに、 3,10だと3行目から10行目までということになります。行指定の場合は、行番号の前のスラッシュは不要です。

パターンアドレス指定と行指定は1つの文の中で混在させても使えます。
たとえば、1行目から最初の空行(空行は、正規表現で^$と表すのを思いだしてください)までを指定したいときは、1,/^$/とします。

さてこれで置換以外のコマンドに入る準備ができました。来週の第10回でsedの基本は終わることになります。では。来週までしばしお待ちを(^0^)

第10回


引用元:sedは日暮れて:第9回 住所指定 - Retroengine

sedは日暮れて:第10回 コマンド落穂拾い



おひさしぶうりいねええ。さぼり~までごめごめ~にゃあみ~ご。

sedの最終回です。置換以外のコマンドのお話として。削除、挿入、追加を紹介しますねん。ではさっそく本題~にゃ。
削除コマンドはd。 構文はこうです。


sed “アドレス d” 対象ファイル > 出力ファイル

アドレス指定は前回やりましたねん。行番号指定でも、文字列指定でもどちらでもOKです。正規表現を使いたいなら、/正規表現/dですね。いずれの場合も、指定の行全体を削除しますので要注意。
———————————————–
行全体でなく、指定した文字列のみを削除したい場合は置換コマンドのsを使います。 s/検索文字列//とすればおおけえ。置換文字列に何も指定しないことによって検索文字列が削除されるわけなんだよおん。
———————————————–

挿入コマンドはi。追加コマンドはa。
挿入は、指定した行の前にテキストを挿入します。追加は文字通り指定行の後にテキストを追加します。

この2つのコマンドはDOSコマンドラインでは直接打ち込めないです。命令が複数行にわたるから。スクリプトファイル(第8回参照)に書いてsed -fで呼び出しましょう。

構文はこうなります。
アドレス i(またはa)\
挿入(または追加したい)テキスト

ここでの¥マークは何かといえば、改行を無視するエスケープだったりします。難しく考えずに例示太郎。sample.txt というファイルの中で「塔にふる雪」という文字列の入った行の前に「坂田靖子作」というテキストを挿入したい場合。エディタで次のような文を書いてscript1という名で保存します。

/塔にふる雪/i\
坂田靖子

んでもって。
sed -f script1 sample.txt > pppp

とすれば、結果ファイル pppp が出来ます。追加は、iのところがaに変わるのみ。また、挿入・追加したいテキストが2行以上ある場合は、テキスト内の改行の前に必ず¥マークを入れ、「まだ構文の続きなんだよおお」ということを示す必要があります。

以上で今回のお話はおしまい。sedの基本についてのお話もおしまい。

10回にわたって、プログラミング未経験の初心者(自分含む)がsedを使うにあたって必要最小限なことの説明をしたつもりです。これまでに説明してきたコマンド以外にもsedには読み出し、書き出し、変更コマンドなどがあります。が。実際に使用する場面がそんなにないと思えたもの(私にとっては。勿論、用途によって要不要の尺度は異なると考えますが)は省略しました。フロー制御などの高度なsedの使用法についても触れていません。基本をおさえることを目的としたからです。

ほおおお。sedの花嫁はハネムーンに旅だってしまいました。見送る私たちは小さく安堵のため息をついて次の場所に向かわなければなりません。ふむむう。来週には出発できるのかしらん。では再会を期して。またまた~にゃ。

補遺1

補遺2

FAQ


引用元:sedは日暮れて:第10回 コマンド落穂拾い - Retroengine

sedは日暮れて:補遺その1・覚えてい~ますかあ?



ごぶさたしておりました。sed拾遺物語こと補遺です。

補遺1:お取り置きしましょうか?~パターンスペースとホールドスペース

sedは行単位でコマンドを実行するものです。それはどおゆうことかといいますと。56億7千万行のテキストファイルがあったとしても。その全部をどか~んと一気に扱うわけではないということです。森の小人さんのように地道に1行1行、取り込んではコマンドを実行しているわけなんですね。その取り込み先こと、小人さんの作業場のことをパターンスペースといいます。パターンスペースはテンポラリバッファらしいですがアモールバッファ©平沢進とどう違うんでしょおか。うむむ。

冗談はさておき。sedのもうひとつのバッファにホールドスペースというものがあります。これは小人さんの倉庫です。パターンスペースとホールドスペース間でデータを移動できるのがsedの特徴なのでした。

つまり。先にパターンスペースで下味をつけておいた材料をホールドスペースにいったん保管しておいて。別の材料の準備がととのい次第、もう一度パターンスペースに戻して、別の材料とまぜまぜするなどということができるのですね。ホールドスペースは倉庫というより待避所といった方がいいかもしれない。

こおゆうホールドスペースに関係するコマンドには、以下のものがあります。


h , H 
待避コマンド。パターンスペースの内容をホールドスペースにもっ てゆく。 hはそれまでのホールドスペースの内容に上書き、Hはその下に追加する 。 
g , G 
復帰コマンド。ホールドスペースの内容をパターンスペースに戻す 。gは上書き、Gは追加。 

交換コマンド。パターンスペースとホールドスペースの中身をチェ ンジする。 
ある条件をもつ行の順番を入れ替えたり、段落ごとに操作をしたりする場合に使えるコマンドであります。例ですか。はい。
あ。例の前に。複数のコマンドを使うときは、スクリプトファイルの中を


あどれす{ 
こまんどお
別のこまんどお
もういっちょこまんどお
}
という形にしますので念のため。

例文として。次の2行からなるファイルがあるとします。


いざスープの水面に帆を立てて
道のひびから花が咲く

この2行をひっくり返すスクリプトは。1行目をホールドスペースに待避して、2行目(=最終行)の後ろでパターンスペースに戻せという内容になります。

1{ 
h
d
}
${
G

という具合(注:$は正規表現ではなく、最終行を表す)。結果は。

道のひびから花が咲く
いざスープの水面に帆を立てて

注意しなくてはならないのはhとdコマンド。もしhでなくHにした場合、それまでのホールドスペースの下に追加されるので。ホールドスペースが空であったら、その空行の下に追加されてしまうのです。つまりよけいな空行が「いざ~」の上についちゃうわけ。

また、hでホールドスペースに1行目を待避しても、パターンスペースには残っているので (カットするのではなくコピーしているので) dコマンドでいったんパターンスペースから1行目を削除しています。


補遺2:祈るようにsedを探して駆けてたこと~参考文献

sedは日暮れて」を書く上で参考にしたのは、

Dale Dougherty著、福崎俊博訳『sed & awk プログラミング』(アスキー出版局)
です。筆者の愛が伝わってくるよいご本であります(^0^)。その他にMS-DOSの古い256倍本も一部参考にしました。
インターネット上では、NiftyServe FMCN フォーラムで行われていたSED教室の内容がWebあるいはftpでgetできます。

SEDLEC Release 1.11←95年改訂の最新版(Web) 
SEDLEC Release 1.00←92年のオリジナル版(ftp。docファイル) 
sedは日暮れて」はsコマンド中心の内容でしたが、こちらは別コマンドを含んだやや難しめの内容だと思います。
NIFTY Serveでは、他にFWORK(在宅ワークフォーラム)でも在宅翻訳がらみで、sedの参考文献の話が出ていたようです。

補遺2

FAQ


引用元:sedは日暮れて:補遺その1・覚えてい~ますかあ? - Retroengine

sedは日暮れて:補遺その2・sed以外の検索・置換(楽ちん度優先)



うんとごぶさたしておりました。sedさらに補遺です。

さらに楽ちんな検索・置換手段

キャラクタベースでsedを覚えておくと何かと便利なことが多いのですが、あっという間に世の中はぐいぐいGUI化されており、DOSUNIXのコマンドベースでお仕事されない方のほうがいまや圧倒的に多いと思われます。というわけで、

正規表現による検索・置換ができ、Windows環境で使える 
便利アプリについても少しだけご紹介しておきますね。

■Oceansoftさんのファイルの検索・一括置換 Grep and Replace(フリーウェア) 
同じディレクトリの中の複数ファイルを一括置換してくれるので便利です。.bakファイルも自動作成してくれるので、正規表現の記述に失敗したとしても、リカバリーが簡単。超おすすめです。 
http://freesoft-100.com/review/grepandreplace.php

■Kats FactoryさんのMultiRep(フリーウェア) 
複数ファイルを一括置換してくれます。さらに画期的なのは、一行ではなく、複数行を置換してくれるということ。これは便利なりよ。要VBランタイム。ダウンロードは、ページの真中あたりの「ソフトの解説・ダウンロード」のメニューから「MultiRep」を選んでください。 
http://www.geocities.co.jp/SiliconValley-PaloAlto/8519/freew.html

■秀まるおさんの秀丸エディタ (シェアウェア、税込4200円) 
改めて紹介するまでもない、有名エディタ。Win上で動くエディタは数多くあれど、1つを選べと言ったらやっぱりこれになりますね。正規表現対応。 
http://hide.maruo.co.jp/software/hidemaru.html

他にも、

・Marboさんのみやぐれっぷ(フリーウェア。「Software」のコーナーからどうぞ) 
・arakenさんのQGREP(フリーウェア、検索のみ)

などがあります。上手に使い分けて楽しい検索置換ライフを! 


引用元:sedは日暮れて:補遺その2・sed以外の検索・置換(楽ちん度優先) - Retroengine

sedは日暮れて:FAQ



よく寄せられる質問とそれに対するお答えをまとめてみました。わかる範囲で全力投球でお答えしていますが、力不足の場合はごめんなさい。 

—————————————
Q1.sed “s/aaaa/bbbb/g” で、aaaaやbbbbが「/usr/local/etc/」など、「/」を多用する場合、エスケープする(=「\」or 「バックスラッシュ」を使う)のが大変なのだが?[00.06.30] 
A1.デリミタ(/)は、別の記号に変えることができます※1。

つまり、sed “s/aaaa/bbbb/g"の代わりに、sed "s#aaaa#bbbb#g"と書いてもOKなんです。aaaaやbbbbの内容によって使い分けるのがよいと思います。awkも同じだと思います。

※1…どんな記号でもよい、というわけではないらしい。たとえば、Linux上で、sedのデリミタに「!」を使うと、bashに叱られます。しくしく。


—————————————
Q2.○○でプログラミングするには、どんな言語を使うとよいですか?(○○は変数。いろんな分野が入ると考えてください)[00.06.30] 
A2.うっわー。そんなに難しいこと私のようなへっぽこスクリプターに聞かれてもわからないです。○○に詳しい方や専門家に聞いてみるか、○○に関連するメーリングリストニューズグループ掲示板などを見つけて質問を投げてみてくださいね。

—————————————
Q3.他に正規表現の例はない?[02.06.05] 
A3. 詳しく説明されているサイトはたくさんあります。検索してみてください。私のおすすめは、Perlになってしまいますが、大崎さんのサイトにある「Perl正規表現雑技」です。また、木村さんの「正規表現メモ」は、grep/sed/awk/perlなどのツールで使用できるメタキャラクタの違いをまとめてらっしゃいます。ぶらぼぉです!さらに正規表現について深く学びたい方は、書籍を購入するのも手だと思います(手元にリファレンスとして置いておけますし)。

[参考] 
Perl正規表現雑技
正規表現メモ
『詳説 正規表現』(書籍) (Jeffrey E.F.Friedl著,歌代和正監訳,春遍雀来,鈴木武生共訳,オライリージャパン)


引用元:sedは日暮れて:FAQ - Retroengine