最近,私は,自宅パソコンで Windows と Linux を行き来しています. 行き来していて時々困るのがテキストファイルです. テキストファイルの改行コードの違いで困ることがあるんです. Linux 上で vi で Windows 上で作成した Ruby のスクリプトファイルを開くと ^M が 行末にくっついているものがあります. この末尾の文字を取り除かないと Linux 上ではスクリプトが動かないのです.
HP-UX 10.20 だと dos2ux というコマンドがあって, Windows のテキストファイルを UNIX 用のテキストファイルに変換できます. 同様のコマンドがないかと思って,ちょっとだけ Linux の中を調べましたが 見つかりませんでした. ( Linux 初心者の私の探し方が甘いだけかも知れません.)
しょうがないので行末の改行コードを取り除くスクリプトを Ruby で作ることにしました. スクリプトの名前は,dos2ux を更に縮めて d2u.rb です.
Windows のテキストファイルの各行の行末の ^M を取り除くには, ファイルの各行の最後の1文字を削れば取り除けます. 文字列の末尾を1文字取り除くには,chop を使います.
また,ファイルから1行ずつ読み込んで, 何か処理してその結果を元のファイルに出力するには ruby コマンドの -n オプションと -i オプションを使うのが簡単でしょう. このときファイルの1行は,$_ に読み込まれます. (-n と -i を合わせて -ni と書けば十分です.)最初のスクリプトはこんな感じです.
#! /usr/local/bin/ruby -ni puts $_.chop
上のスクリプトは,Windows のテキストファイルに対して2回以上使うと ひどい目にあいます. 毎回各行の末尾の1文字を削ってしまいます. という訳で,改行文字を削除するように修正することにしました. 改行文字を削除するには,発想をちょっとだけ変えて, 改行文字を空文字に変更するという風に考えます. 文字の変更には,gsub を使います.
という訳で,こんな感じです.
#! /usr/local/bin/ruby -ni puts $_.gsub('\r\n', "")これで何回実行しても大丈夫です.