---------- SED 教室 第十二回 「~から~まで、基礎編」 ---------- SED 教室の第三回目 (ずいぶん前ですね :-) で次の実行条件を紹介しました。 「実行条件1」,「実行条件2」 実行条件1が成立した行から実行条件2が成立する行までの間の行で成 立する実行条件。 たとえば、次のスクリプトを考えます。 <<< TEST1.SED >>> --------------------------------------- /これ/,/そして/p d --------------------------------------- 「/これ/」という実行条件が成立する行 (「これ」という文字列を含む行です ね) から、「/そして/」という実行条件が成立する行まで、命令「p」を実行し ます。スクリプト二行目の命令「d」の前には何も実行条件がついていませんか ら、すべての行で「d」が実行されます。従って、「これ」を含む行から「そし て」を含む行までは、「p」「d」が実行されるので標準出力に吐き出され、その ほかの行は「d」のみが実行されるので、何も出力されません。 # SED の動き方を思い出しましたでしょうか? では、標準入力から次のファイルを読み込むことにします。 <<< INPUT.TXT >>> --------------------------------------- これは一行目だ。 こっちは二行目。 そして三行目。 つづいて四行目。 これが五行目。 六行目。 最後の七行目。 --------------------------------------- 「/これ/」は <<< INPUT.TXT >>> の 1 行目と 5 行目に、「/そして/」は 3 行目にマッチしますね。したがって次の文字列が標準出力に吐き出されます。 --------------------------------------- これは一行目だ。 こっちは二行目。 そして三行目。 これが五行目。 六行目。 最後の七行目。 --------------------------------------- でも、ちょっと待ってください。1, 3, 5 行目は実行条件の中にマッチする条 件があるのですが、2, 6, 7 行目には「これ」という文字列も「そして」という 文字列も含まないので、条件の字面だけでは条件が成立しているかどうかの判定 が出来ませんよね。いったい SED はどうやって 2, 6, 7 行目を読んでいるとき も条件が成立していることを知るのでしょう? 答は単純です。SED が現在「/これ/,/そして/」という条件が成立しているこ とを覚えているのです。SED は『「実行条件1」,「実行条件2」』という実行 条件がある行に対しては、以前に「実行条件1」が成立したかどうかを覚えてい ます。以前に「実行条件1」が成立しているならば、条件『「実行条件1」, 「実行条件2」』も成立するわけです。そして「実行条件2」が成立する行に出 会うと「実行条件1」がかつて成立したということを忘れてしまいます。薄情で すね。:-) まとめますと、 「実行条件1」,「実行条件2」 が成立するのは、 「実行条件1」が成立する行か、または 「実行条件2」が成立する行か、または かつて「実行条件1」が成立したということを SED が覚えている時です。こ の時、「実行条件2」が成立するならば SED は以前に「実行条件1」が成立し たということを忘れてしまいます。 では次のスクリプトはどうでしょう。 <<< TEST2.SED >>> --------------------------------------- /これ/d /これ/,/そして/p d --------------------------------------- <<< TEST1.SED >>> と同様 <<< INPUT.TXT >>> の 1, 2, 3, 5, 6, 7 行目が出 力されると言いたいところだけど <<< TEST2.SED >>> の一行目によって「これ」 を含む行が削除されるから、2, 3, 6, 7 行目が出力されそうですね。ではやっ てみましょう。 --------------------------------------- A>sed -f TEST2.SED INPUT.TXT A> --------------------------------------- あれ?何も出力されない。困った。^^;) なぜ出力されないかと言うと、実行条件「/これ/,/そして/」が成立しないか らです。一見 <<< INPUT.TXT >>> の 1 行目に「これ」という文字列があるので 条件が成立しそうですが、1 行目はスクリプト一行目で条件が成立し命令「d」 で削除されてしまうのです。したがって <<< INPUT.TXT >>> の 1 行目をスクリ プトの二行目は読むことができず、その結果二行目の実行条件は成立しないので す。 このように SED はスクリプトの一行目から順に処理を進めて行くので、パター ンスペースの内容が変化する場合や、命令「d」「b」などによってジャンプする 場合は注意が必要です。 --- GCD03723 (Greatest Common Divisor:最大公約数)