特定の文字列を含むセクションだけを抜き出す (続き)

以下からの続きです。

なんとなく見えているところとして、

  • gawk の基本動作とは異なる動作をしている
  • Cygwin 固有の問題 or gawk 固有の問題
    • 前者だと Cygwin の binmode (Cygwin は小文字) でマウントしていれば変換されないはず
    • 後者だと awk.h やら io.c やらとかで gawk の BINMODE (gawk は大文字) で Cygwin 特有の分岐があるのが怪しい

という部分があります。

まず、Cygwin のマウントが binmode であることを確認します。(うちの環境なので細かな部分は無視してください)

$ mount
C:\cygwin\usr\X11R6\lib\X11\fonts on /usr/X11R6/lib/X11/fonts type system (binmode)
C:\cygwin\bin on /usr/bin type system (binmode)
C:\cygwin\lib on /usr/lib type system (binmode)
C:\cygwin on / type system (binmode)
c: on /cygdrive/c type system (binmode,noumount)
d: on /cygdrive/d type system (binmode,noumount)
e: on /cygdrive/e type system (binmode,noumount)

つまり binmode でマウントされています。

ここで、特定の文字列を含むセクションだけを抜き出す (2) - 日本 GNU AWK ユーザー会 0.2で使用した Makefile を用いて実行してみます。

$ make -s
(1) RS: none, ORS: none
0000000  \n  \n
0000002
(2) RS: none, ORS: \n
0000000  \n  \n
0000002
(3) RS: none, ORS: \r\n
0000000  \r  \n  \r  \n
0000004
(4) RS: \n, ORS: none
0000000  \n  \n
0000002
(5) RS: \n, ORS: \n
0000000  \n  \n
0000002
(6) RS: \n, ORS: \r\n
0000000  \r  \n  \r  \n
0000004
(7) RS: \r\n, ORS: none
0000000  \n  \n  \n
0000003
(8) RS: \r\n, ORS: \n
0000000  \n  \n  \n
0000003
(9) RS: \r\n, ORS: \r\n
0000000  \n  \n  \r  \n
0000004

みごとに2007-10-11 - 木っ端拾いの材木流しで書かれていることが再現されました。

次に怪しいのが gawk の BINMODE です。
実行してみましょう。

$ make -s AWK='gawk -v BINMODE="r"'
(1) RS: none, ORS: none
0000000  \r  \n  \r  \n
0000004
(2) RS: none, ORS: \n
0000000  \r  \n  \r  \n
0000004
(3) RS: none, ORS: \r\n
0000000  \r  \r  \n  \r  \r  \n
0000006
(4) RS: \n, ORS: none
0000000  \r  \n  \r  \n
0000004
(5) RS: \n, ORS: \n
0000000  \r  \n  \r  \n
0000004
(6) RS: \n, ORS: \r\n
0000000  \r  \r  \n  \r  \r  \n
0000006
(7) RS: \r\n, ORS: none
0000000  \n  \n
0000002
(8) RS: \r\n, ORS: \n
0000000  \n  \n
0000002
(9) RS: \r\n, ORS: \r\n
0000000  \r  \n  \r  \n
0000004

というわけで、Linux と同じ挙動になりました。

要するに Cygwin では gawk でよしなに変換してくれていたということになるということでしょうか?

すっきりしてないのですが、改行を含めて Unix 系 OS と同じにするなら BINMODE で実行するのが望ましいのかもしれません。

gawkhttpd を作成したときも Cygwin だけバイナリを通すと挙動が異なっていたのですが、この辺が影響していたのかもしれません。

・・・曖昧でスミマセン。