作者: 藤岡和夫
日時: 2008/8/30(09:14)
On Sat, 30 Aug 2008 01:39:01 +0900
Bunta <hi9t-ooy@...-net.or.jp> さんwrote:

> >  このスクリプトで、なぜデリミタの前を見ることができるのか説明していただ
> > けますか。sedを思い出したいので^^)
> 
>  そのスクリプトではありません。最初の発言をみてください。

 言葉が通じませんね。以下、ご指摘のスクリプトの動作について質問をしてい
るのです。最初から一つ一つ確認していきましょう。私は冗談ではなく、本当に
このスクリプトがどのように動作するのか教えてもらいたいのです。文太さんの
意図どおりに動作することは確認していますよ(^^)なぜそんなことができるのか
を説明して欲しいのです。ステップを追って、動作を言葉で説明して欲しい。

> 
> 【#2436からの引用】(変態なsedでなければ通じるはず)

 変態なsedとは何を指しているのですか?

> ===== test.sed =====
> # デリミタ"---"の前が改行でないなら改行挿入
> $!N
> /^[^\n][^\n]*\n---$/{
>         s/\n/\
> \
> /
>         P
>         s/[^\n]*\n//
>                 }
> P
> D
> ====================
> 
>  そして、以下は
> 【#2437からの引用】

 次のスクリプトは今問題にしない。

> 
> 純粋に不具合発見用のテストをしました。
> 
> =====================
> aaa
> ---
> =====================
> 
> といった入力が
> 
> =====================
> aaa
> 
> ---
> =====================
> となれば正解のはずです。
> 
> 
> ------- test.sed -------
> #egsed(GNU4.0.7), ssed, onigsed
> $!N
> /^aaa\n---$/{
> 	s/\n/\n\n/
> 	P
> #	s/aaa\n//		# こうなら誤って2つ消しはしない
> #	s/[^\n]*\n//		# これだと2つ消す
> 	s/[^\n]\+\n//		# これでも2つ消す
> }
> P
> D
> ------------------------
>  これがバグ特定用(つもり)です。詰められていません。
> 
> 
> >  昔のsedは、s/^---$/\n&/の書き方を許さなかったのです。
> 
>  はい、
> s/^---$/\
> &/
>  でしょう、正統的には。アンサパンドがそこで通じるかは申し訳ありませんが
> 分かりませんけれど。

C:\Scripts>bin\sed --version
GNU sed version 1.18 + multi-byte extension 1.03

では「&」は使えます。

→ sed win32:http://www.vector.co.jp/soft/win95/util/se015016.html

 このsedが、s/^---$/\n&/を許さないと言ったのです。

 Dale Dougherty著「sed & awk」(アスキー出版局、1991年;原著: 1990年)には
「アンパンサンド」は出ていますね(134ページ)。

> 
> Bunta

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