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

  • このエントリーをはてなブックマークに追加
  • LINEで送る

改行コードの種類

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

改行コードOS
LFLinux, macOSなど
CR+LFWindowsなど

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

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

- Sponsored Link -

改行コードを変換する

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オプションで直接上書きをする場合は取り返しがつかなくなりますので、必ず実行前にバックアップをとることをおすすめします。

sed編

LF⇛CRLF

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

CRLF⇛LF

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

参考ページ

このブログを応援する

お寄せいただいたお気持ちは全額サーバ代や次の記事を執筆するための原資として活用させていただいております。この記事が参考になった場合などぜひご検討ください。

PayPal(ペイパル)
PayPalで300円支払う
※金額は任意で変更できます。
※100円でも泣いて喜びますw
※住所の入力欄が現れた場合は「no needed」を選択ください
これまでのご協力者さま
- Sponsored Link -

ご質問やリクエストなどお気軽に。メールアドレスの入力は任意です。書き込みが反映されるまで時間がかかります。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください