Linuxでファイルの改行コードLF⇔CRLFを変換する方法

linux-lf-crlfテクノロジー

前回、Linuxで文字コードがUTF-8のファイルに対して、BOM付き⇔BOMなしを変換する方法をご紹介しました。

今回は、改行コードLFCRLF変換する方法をご紹介します!

3つの改行コード

面倒なことに、OSによって改行コードが異なります。

LF: UNIXやUnix系のシステム。Linux、AIX、Xenix、macOS、BeOS、Amiga、RISC OSなど。
CR+LF: CP/M、MP/M、MS-DOS、OS/2、Microsoft Windows。
CR: コモドールによるシステム、Apple IIファミリ、Mac OS(バージョン9まで)、OS-9。

改行コード – Wikipedia

普段からよく使う改行コードは、LinuxLFWindowCRLFです。
利用するシステムによっては、これらの改行コードの違いが邪魔して、動かなかったりします。
そこで、LFからCRLF、またはCRLFからLFに変換してみましょう。

改行コードを確認する

fileコマンドを使う

BOM編でもご紹介したfileコマンドを利用して確認できます。

file sample.txt

このように入力すると、CRLFの場合は以下のように表示されます。

sample.txt : UTF-8 Unicode (with BOM) text, with CRLF line terminators.

with CRLF line terminators」と表示されればCRLF、無ければLFということになります。

odコマンドを使う

以下のように実行すると、

od -c sample.txt

改行している箇所が「nLF)」または「rnCRLF)」で表示されます。
詳しくは以下を参照。

sedコマンドで一括置換

それでは、改行コードを確認したので変換していきます!
一般的には、nkfコマンドを利用して変換する情報が多いのですが、著者の環境ではnkfをインストールしておらず、代わりに文字列を置換する際によく使うsedコマンド変換します。

sedコマンドの基本的な使い方は以下の通りです。

sed s/[置換対象文字列]/[置換後の文字列]/ [ファイル名]

LF ⇒ CRLF

まずは、LFCRLF変換する方法です。
以下のように、sedコマンド正規表現を使って変換します。

sed 's/$/r/g' sample.txt > lf2crlf.txt

実行したら「lf2crlf.txt」ファイルに対して上記の確認コマンドを実行してみてください。

CRLF ⇒ LF

次は逆のCRLFをLFに変換する方法です。

sed 's/r//g' sample.txt > crlf2lf.txt

当たり前ですが、正規表現の部分が違うので注意してください。

ハマったところ

sedの使い方をよく読んでなくて失敗した経験談です。
最初は指定した[ファイル名]をそのまま編集してくれると思ったのですが、置換した結果を表示するだけでした。
そこで、同じファイル名に出力したら上書きしてくれるのかと思いきや、空のファイルになってしまいました。
ですので、上記のサンプルでは後ろに別ファイル名で出力するようにしています。

東京生まれ福岡育ちの文系プログラマー。
テクノロジーの恩恵を感じながら日々精進しています。
広く浅くをモットーに、最近ではプログラミングだけでなく、仮想サーバーからセキュリティ、監視システムなども勉強中です。

管理者をフォローする

コメント

タイトルとURLをコピーしました