作者: Bunta
日時: 2008/8/31(11:47)
藤岡さん

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

 なるほど。「両方」ですか。φ(.. ) いえ、その後Perlはまったくさわってなくて…。
 sedについて調べ方がよく分かりませんが、「常識として」(?)改行文字の後ろでないと変だと思う。
だって「\n」って、「.」マッチしますから。

--- test.sed ---
$!N
s/a.b/anb/
----------------
--- test.txt----
aa
bb
----------------
--- kek --------
aanbb			#もちろん「.」は「\n」にマッチ
----------------

--- test.sed ---
G			#文字列末尾に「\n」追加
s/$/z/
s/\n/n/
----------------
--- test.txt----
aa
----------------
--- kek --------
aanz
----------------

 おお、調べられた。「常識どおり」でした。
(2つ目のテストをcmd.exe+command.com+16bit sedな環境で、
>echo aa |sed "G;s/$/z/;s/\n/n/"
とやらないのが吉です。こんなのは知らない。)


> 特に複行の場合は、パターンスペースで行末に\nがないと次の行が後ろに入っ
>たときに行の区切りが分からなくなりますね。Pコマンドは最初の改行までを出
>力するわけですから。そしてDコマンドは最初の改行までを削除するわけですか
>ら。
> そのように、Doughertyのsed & awkには書いてありますね。それでループがう
>まく回るので納得したのですが^^;)パターンスペースに読み込んで改行が取られ
>ると複行処理ができないのでは。

 うーん、納得されていてうまくいくようならその解釈でよいのでしょう。
 ただ最後の「複行処理ができないのでは」の部分は、()書きしたでしょ。
(複行は別)と。問題はタイミングなんです、たぶん。

 単行のデフォルト読み込みではパターンスペースに改行文字はありません。
「^aaa$」です。
 「aaa\nbbb」ができあがった複行だとします。\nはいつ出現したのか。
「Nでbbbを読み込んだとき」というのが僕の解釈です。なので、この時点では、
「bbb」の後ろには【まだ】\nがない、と。別の言い方をすると、次のNで
「aaa\nbbb\nccc」となるときに「bbb」のあとの\nが追加される。藤岡さんの
解釈と微妙に違いますよね。

 もちろん、僕もDoughertyさんの本には大変お世話になっています。97年の
11刷!

Bunta