改行コードの変換あれこれ

テキスト文書の改行文字は3種類が使われている。

OS改行コード正規表現などでの記号
unixLF\n
Mac OS(主にMac OS X以前)CR\r
WindowsCR+LF\r\n

最近はあまり気にしないでも問題ないことが多いが、古いシステムのシフトJISデータを扱うことがあって、きちんと精査しないとまずいかったのまとめておく。

テキストの生データを確認

odコマンドでキャラクタ表示にして確認するのが簡単。

$ od -c sample.csv | lv

0004060   e   x  \t   R   e   g   i   s   t   D   a   t   e   T   i   m
0004100   e   I   D   L   i   s   t   "  \r  \n   1   0   3  \t 212 224

改行文字の検索は、/(スラッシュ)を入力して検索モードに降りてから、\\バックスラッシュ2回(エスケープ)とnやrを入力すれば良い。

改行コードの一括変換

目的の改行コードに一括変換するにはnkfが確実だろう。

・LF(UNIX系)に変換
$ nkf -Lu sample.txt > output.txt
・CRLF(Windows系)に変換
$ nkf -Lw sample.txt > output.txt
・CR(旧Mac OS系)に変換
$ nkf -Lm sample.txt > output.txt

 

Perlで検索置換

基本的には\rと\nをそのまま使えば良いが、前方不一致や後方不一致の構文を入れて行う点がポイント。 

$ perl -pe 's/(?<!\r)\n/\r\n/g' unix.txt > windows.txt

よく例でありがちな、's/\r/\r\n/g'のような安易な変換は危険なので注意。改行コードが混じったテキストがあったときや、変換元のコードの勘違い、変換の多重実行でなどの行為で、簡単にCRCRLFなどになって壊してしまう。