藤岡さん
> 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