[Linux] 改行コードを変換する

改行コードの種類

まず大前提としてOSや利用している環境によって、最近では大きく2つの改行を表す文字コードが存在します。

改行コード OS
LF Linux, macOSなど
CR+LF Windowsなど

以前のMacOSではCRが採用されていましたが、MacOSX以降はUnix系OSと同じLFとなっています。

変換の必要が出てくるシチュエーションとしては、Windows環境からLinuxなどへファイルを移した時などですね(もちろんWindowsでも環境を整えればLFで作成はできますが)

改行コードを変換する

nkf編

nkfコマンドはもともと文字コードを変換するための物ですが、改行コードの変換にも対応しています。-LuオプションでLFに、-LwオプションでCR+LFに変換することができます。「u」がUNIX、「w」がWindowsの頭文字だと覚えておくと思い出しやすいですね。

$ nkf -Lu foo.txt | nkf --guess
UTF-8 (LF)

$ nkf -Lw foo.txt | nkf --guess
UTF-8 (CRLF)

-d, -cオプションでも同様の結果が得られます。

$ nkf -d foo.txt | nkf --guess
UTF-8 (LF)

$ nkf -c foo.txt | nkf --guess
UTF-8 (CRLF)

上書きする

同名のファイルに実行結果を上書きしたい場合、安直にリダイレクトすると最終的にファイルが真っ白になってしまいます。

$ nkf -Lu foo.txt > foo.txt
$ cat foo.txt
(真っ白)

nkfでは--overwriteオプションが用意されており、これを指定すると手軽にファイルを上書きできます。

$ nkf -Lu --overwrite foo.txt

一時ファイルを用意してmvで上書きしても良いのですが面倒ですしね。

複数のファイルをまとめて変更する

findで検索した結果をパイプでnkfコマンドに渡して変換します。前述の通り--overwriteオプションによってファイルがそのまま上書きされるのでご注意を。この例では拡張子が.shのファイルを検索しています。

$ find . -name '*.sh' -type f | nkf -Lu --overwrite

findの検索結果が膨大になる場合、Bashなどのシェルで渡せる上限を超えてしまう可能性があるので、xargsコマンドをnkfの前に挟んであげると安全ですね。

$ find . -name '*.sh' -type f | xargs -n 10 nkf -Lu --overwrite

※参考 複数ファイルの改行コードを一括置換しちゃう

注意点

ちなみにですが、改行コードを変換したいだけなのにファイル全体の文字コードが変わってしまう場合があります。以下のようにUTF-8でCRというファイルの改行コードだけをLFにしようとnkf -Luを叩くと、最終的にISO-2022-JP(JIS)になってしまいました。

$ nkf --guess foo.sh
UTF-8 (CR)

$ nkf -Lu foo.sh | nkf --guess 
ISO-2022-JP (LF)

これは出力後の文字コードも同時に指定しておくことことで回避できます。改行コードだけの変換であっても安全のため文字コードの指定をお忘れなく。(-wオプションでUTF-8に変換されます)

$ nkf -Lu -w foo.sh | nkf --guess
UTF-8 (LF)

こういった意図しない結果になる場合があるので、必ず変換後のファイルは開いて確認をした方が良いです。特に--overwriteオプションで直接上書きをする場合は取り返しがつかなくなりますので、必ず実行前にバックアップをとることをおすすめします。

blog.katsubemakito.net

sed編

LF⇛CRLF

$ sed 's/$/\r/g' foo.txt

CRLF⇛LF

$ sed 's/\r//g' foo.txt

参考ページ