sed で Quine

あなごるのデッドラインまでに書けたので嬉しかったのでした。

s/^/s_S^_SD_S;h;s!_[S]!_S!g;H;x;s!.s_S^.D!!;H;x;s@D.*[@].s@s@/;h;s!_[S]!/!g;H;x;s!.s/^.D!!;H;x;s@D.*[@].s@s@

最初の s/// の中に書けない / を _S としておいて後から頑張って復元するんだけど、全ての _S を / にしちゃうと、今度はエスケープのままになってるべき部分とかも / になっちゃってムキーなのでホールドバッファを使ったり。あとはバックスラッシュを使うとそれもエスケープしにゃならんくなって長くなるのでそれを意地でも回避する。

あと最後の

s@D.*[@].s@s@

って正規表現中にセパレータ含めるってのはすごいと思いました。 Perl にも Ruby にもできない芸当でござる。なんかどっちかっていうとそれはバグじゃないかとか思ってしまうけど。 GNU awk もできるみたいだ。

i@colinux ~> echo / | awk '/[/]/ {print}'
/

mawk はだめみたいだ。

i@colinux ~> echo / | mawk '/[/]/ {print}'
mawk: line 1: regular expression compile failed (bad class -- [], [^] or [)
[
mawk: line 1: syntax error at or near ]
なにかあれば下記メールアドレスへ。
shinichiro.hamaji _at_ gmail.com
shinichiro.h