特定の文字列を含むセクションだけを抜き出す (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の出力は以下のようになるはずです。」のとおりになっています。
Zaurus の gawk だと不安 (?) なので、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