---------- SED 教室 第二回 「フィルタ」 ---------- 標準入力からテキストを読み込んで、適当に加工して標準出力に吐き出すプロ グラムを総称してフィルタと呼びます。第一回目で列挙したツール head, tail, cut, grep, tr これらは全てフィルタです。それぞれの働きを簡単に紹介しま すと、 head -5 先頭の 5 行を出力する。 tail -5 最後の 5 行を出力する。 cut -f2 各行の第 2 フィールドのみ出力する。フィールドとは空白文字 で区切られた文字列の事です。 grep abc abc という文字列を含む行のみ出力する。 tr A-Z a-z A から Z までの文字を a から z までの文字に変換して (つま り大文字を小文字に変換して) 出力する。 となります。これらのコマンドは沢山のオプションが指定できますが、とりあ えず基本的なものを述べてみました。 さて、ご存知の方も沢山いらっしゃるでしょうが、SED は Stream EDitor の 略です。Stream とは何ぞやというと、一般的にいえばシーケンシャルなデータ 列の事ですが、この場合は標準入力から読み込んだ文字列の事です。その Stream を適当に加工して (Edit) 標準出力に吐き出すのが SED の役目という事 になります。そして加工方法を指定するのがスクリプトです。 SED はスクリプトを書く事によって様々なフィルタの働きを真似する事ができ ます。論より証拠、前述したフィルタの真似をさせてみましょう。 head -5 sed -e 5q これは -e を省略して sed 5q と書く事もできます。 tail -5 sed -e :l -e $q -e N -e "2,5b l" -e D うーむいきなり長い このように長いのはスクリプトを別に用意した方がよいかも知れません。 <<< TAIL.SED >>> --------------------------------------- :l $q N 2,5b l D --------------------------------------- というファイルを作っておいて、 sed -f TAIL.SED と呼び出します。 cut -f2 sed -e "s/^[^ ]+[ ]+\([^ ]+\) .*$/\1/" このようにスクリプト内に空白文字などを含む場合は "..." で囲む必要があ ります。スクリプトをファイルに書くときは "..." で囲む必要はありません。 grep abc sed -e /abc/!d こういう短いのっていいですね。 tr A-Z a-z sed -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ これは汚い。^_^;) tr みたいに A-Z と指定できると良かったのですが、sed ではこのように全部書かないと駄目です。こんな長いのいちいち入力する訳には 行きませんが、バッチファイルに書く分には問題ないでしょう。 このように、大抵のフィルタの機能は真似できるので、ディスクの中に SED があればいくつかのプログラムをお払い箱にできてディスク容量の節約となりま す。 実際に SED を実行してどのような動きをするかぜひ実験してみてください。 最後にスクリプトの文法をちょっとだけ紹介して終わりにしたいと思います。 SED のスクリプトは、「実行条件」と「命令」からなります。例えば head -5 の真似をする sed -e 5q の場合でしたら 5 が実行条件で q が命令です。5 が なんで条件なのという声が聞こえてきそうですが、これは標準入力から読み込ん だテキストの「5 行目ならば」という意味です。では命令 q の意味は? 何とな くわかりそうですね。quit の q でして、実行終了という事です。 SED は一行づつ標準入力からテキストを読み込みまして、一行目、二行目と必 死 (かどうかは知りませんが :-) に数えます。そして一行読み込む度にスクリ プトを眺めまして、実行条件が成立する物がもしあれば実行条件の後ろに書いて ある命令を実行するのです。どの実行条件も成立しないときは標準入力から読ん だテキストをそのまま標準出力に書き出します。かくして五行読み込んだ時点で 条件成立し、実行終了となります。実行終了の時も読み込んだ行を出力しますか ら、合計 5 行が標準出力から出てくるという事になります。 スクリプトの説明をちょっとだけしてみました。おわかりになりましたでしょ うか。次回からスクリプトの文法をばんばん説明していきます。 --- GCD03723 (Greatest Common Divisor:最大公約数)