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


手元に Cygwin がないので、まず Linux でどうなるかということを調べてみます。
先に infile.txt を作っておきます。

$ cat infile.txt | od -t c
0000000  \r  \n  \r  \n
0000004

こんな感じでしょうか。
こういうテストでは最近 make にお世話になっているので、Makefile を作ります。
make は変数を引数で変えられるため、Ver. の異なるもの (ここでは awk のバリアント) を多数調べたりするのに比較的便利です。

AWK = gawk

all:
    echo '(1) RS: none, ORS: none'
    $(AWK) '{print}' infile.txt | od -t c
    echo '(2) RS: none, ORS: \n'
    $(AWK) -v ORS='\n' '{print}' infile.txt | od -t c
    echo '(3) RS: none, ORS: \r\n'
    $(AWK) -v ORS='\r\n' '{print}' infile.txt | od -t c
    echo '(4) RS: \n, ORS: none'
    $(AWK) -v RS='\n' '{print}' infile.txt | od -t c
    echo '(5) RS: \n, ORS: \n'
    $(AWK) -v RS='\n' -v ORS='\n' '{print}' infile.txt | od -t c
    echo '(6) RS: \n, ORS: \r\n'
    $(AWK) -v RS='\n' -v ORS='\r\n' '{print}' infile.txt | od -t c
    echo '(7) RS: \r\n, ORS: none'
    $(AWK) -v RS='\r\n' '{print}' infile.txt | od -t c
    echo '(8) RS: \r\n, ORS: \n'
    $(AWK) -v RS='\r\n' -v ORS='\n' '{print}' infile.txt | od -t c
    echo '(9) RS: \r\n, ORS: \r\n'
    $(AWK) -v RS='\r\n' -v ORS='\r\n' '{print}' infile.txt | od -t c

実行してみましょう。

$ make -s
(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

分かりにくいのですが、id:wushi さんの言う「これが正しいとすると、#4〜#9の出力は以下のようになるはずです。」のとおりになっています。

Zaurusgawk だと不安 (?) なので、Fedora Core 6 の gawk で試してみましたが、同じ結果でした。
mawk でも同じ結果です。

gawk ではなく、Cygwin に依存するところがありそうです。

追記ですが、以下に示す nawk は変な結果になりましたが、これはこれで置いておきます。

$ make -s AWK=nawk
(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  \n  \n  \n
0000005
(8) RS: \r\n, ORS: \n
0000000  \n  \n  \n  \n  \n
0000005
(9) RS: \r\n, ORS: \r\n
0000000  \r  \n  \n  \r  \n  \n  \r  \n
0000010