改行コード変換のメモ
CRLFとLFだけ。さすがにCRだけのものはあまりないでしょう。
環境
- CentOS release 6.5 (Final)
nkf
みんな大好きnkfコマンド。--helpでオプションを確認しましょう。
$ nkf --help 2>&1 | grep CRLF
d,c Convert line breaks -d: LF -c: CRLF
-L[uwm] line mode u:LF w:CRLF m:CR (DEFAULT noconversion)
unix -> dos は -Lw(win) で、dos -> unix は -Lu(unix) です。
$ file unix.txt dos.txt
unix.txt: ASCII text
dos.txt: ASCII text, with CRLF line terminators
$ nkf -Lu dos.txt > dos2unix.txt
$ nkf -Lw unix.txt > unix2dos.txt
$ file dos2unix.txt unix2dos.txt
dos2unix.txt: ASCII text
unix2dos.txt: ASCII text, with CR line terminators
dos2unix, unix2dos
いかにも dosからunixに変換してくれるっぽいコマンドもあります。
これらのコマンドは、引数にファイルを指定すると、ファイルの改行を書き換えて保存してしまいます。便利ですが、パイプで渡してあげる方がUNIXの流儀っぽいです。
$ cat dos.txt | dos2unix > dos2unix.txt
$ cat unix.txt | unix2dos > unix2dos.txt
perl, ruby
perlもrubyもワンライナーだとほとんど同じですよね。
$ perl -pe 's/\r//' dos.txt > dos2unix.txt
$ perl -pe 's/\n/\r\n/' unix.txt > unix2dos.txt
$ ruby -pe 'sub("\r", "")' dos.txt > dos2unix.txt
$ ruby -pe 'sub("\n", "\r\n")' unix.txt > unix2dos.txt
sed
環境によってはnkfもdos2unixもperlもrubyもインストールされていないかもしれません。でもsedはどのUNIXにも存在します。CRを削るだけなら超簡単です。
$ sed "s/\r//g" dos.txt > dos2unix.txt
\rと書くよりC-v C-m で制御コードを入れるほうがカッコイイので、私はこちらを多様することが多いです。
$ sed "s/^M//g" dos.txt > dos2unix.txt