ShellScript

色々な改行コード変換の方法

More than 3 years have passed since last update.


改行コード変換のメモ

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