somemo's diary

プログラマ、雑記、プログラミング関係はLinkから、数式はこっちでまとめていることが多い

【Linux】改行コードの変換

Linux環境での改行コードの変換に関するメモです。Linuxで扱う改行コードはLFのため、Windowsでの改行コードCRLFが混じっていると正しく動作しないことがあります。

unix⇔dos

改行コードを簡単に変換してくれるコマンドが2つ存在します。

unix2dos ファイル名
dos2unix ファイル名

dos2unixは、CRLFをLFに変換します。unix2dosはLFをCRLFに変換します。

trコマンド

trは、文字列の置換用コマンドです。その他にも-dオプションを付けることで引数を削除するモードにもなります。

tr -d '^M' < crlf.txt > lf.txt 

「^M」は「C-V後にC-M」で入力できます。これはCRを意味するようです。入力と出力のファイルが同一の場合、0バイトになってしまったので、別ファイルに出力しています。

nkfコマンド

nkfは、文字コードを調べたり変換するためのコマンドです。-Lオプションをつけることで改行コードを変換できるようになります。

nkf -Lu crlf.txt > lf.txt
nkf -Lm crlf.txt > cr.txt
nkf -Lw cr.txt > crlf2.txt
nkf -Lw lf.txt > crlf3.txt

-Lの後に続く文字は、OSの先頭文字ですので覚えやすいです。

  • u:Unix(LF)
  • m:Mac(CR)
  • w:Windows(CRLF)

sedコマンド

sedは、ファイルの1行ごとに対する処理を行うためのコマンドだと思っています。以下は、CRを空文字に変換しています。つまりCRの削除です。

sed -e 's/^M//g' crlf.txt > lf.txt

trコマンドと同様、同じファイルに出力すると0バイトになってしまうので、別のファイルに出力しています。しかし、trと違いsedには上書きモードがあります。

sed -i.bak -e 's/^M//g' crlf.txt

-iが上書きのためのオプションです。その後に続くのは、バックアップ用の拡張子です。

感想

引出しが狭いこと実感しましたし、知らないコマンドだらけで勉強になりました。他にもawkというコマンドでもできたり、ファイルをループで回してechoしたりなど、いろんな方法があるようです。