作者: 藤岡和夫
日時: 2008/8/31(01:17)
On Sun, 31 Aug 2008 00:03:03 +0900
Bunta <hi9t-ooy@...-net.or.jp> さんwrote:

>  僭越ですけれど、ここだけ確認させていただきます。パターンスペースに行を
> 読み込んだら改行は取られます。 出力するときに付けられます。(複行は別)
> →「\n---\n」となる★、ここが気になりました。デバッガも「$」って書いてく
> れてますよね。

 Perlなんかでは、$というのは、文字列の末尾あるいは行末に改行文字がある
場合にはその直前の両方にマッチしますからね。sedはどうかな。

 特に複行の場合は、パターンスペースで行末に\nがないと次の行が後ろに入っ
たときに行の区切りが分からなくなりますね。Pコマンドは最初の改行までを出
力するわけですから。そしてDコマンドは最初の改行までを削除するわけですか
ら。

 そのように、Doughertyのsed & awkには書いてありますね。それでループがう
まく回るので納得したのですが^^;)パターンスペースに読み込んで改行が取られ
ると複行処理ができないのでは。

>  元のはいちおう理由があって(ロジックが分かりやすかったでしょ)ああなっ
> ているのですが、以下のように書いたほうがすっきりするかもしれません。
> 
> -------------------------
> $!N
> /^[^\n][^\n]*\n---$/{
> 	P
> 	s/^[^\n]*//
> }
> P
> D
> -------------------------

 なるほどね。区切りの改行を2回出力するわけですね。

 そうですね。空行が---行の直前にあったりなかったりするのを、あることに
調節するだけなら、

/^$/d
s/^---$/\n&/

が簡単そう。ただ、この場合、必要な空行を削除してしまうのが難点。それが嫌
なら複行処理を使うしかないですね。

藤岡 和夫
kazuf@...
日曜プログラマのひとりごと http://homepage1.nifty.com/kazuf/renewal.html