^M 問題について

vi でテキストファイルを編集しよとファイルを開くと、なぜか行末に ^M が表示されることがよくあります。

原因は、Windows OS の改行コードにあります。

この事象は、Windows 上で作業したファイルをそのまま、UNIX 系の OS へアップロードした時によく発生します。

また、改行コードは、OS によって異なります。

OS 改行コード 備考
Windows CR+LF Carriage Return + Line Feed
UNIX 系 LF Line Feed
Mac CR Carriage Return
  • Windows で作成したファイルの改行コードは CR+LF
  • UNIX 系の改行コードは、LF

よって、^M 文字問題は、Windows の CR コードによるもので、Windows で作成したテキストファイルを vi で開くと、転送方式によっては、すべての行末に ^M が表示されるようになります。

Linux のファイルを Windows へ転送するとどうなる?

逆に、Linux 上で作成したファイルの場合、改行コードは、LF だけなので、このファイルを Windows 環境で開くと CR コードが存在しないため、全て 1行に見えます。

^M を除去するには

例えば、Windows 環境で作成された windows.txt ファイルを Linux 環境で vi で開いたときに以下のように行末に ^M が付いていたとします。

この ^M 文字は、vi のコマンドモードで、以下の文字列置換機能を利用することで、簡単に除去できます。

:%s/^M//g

^M は、制御文字

^M は制御文字であるため、特殊な方法で入力しないといけません。

普通に ^M 順に入力するのではなく(2つの文字列として認識される)、Ctrl + vm 順に入力してください (1つの制御文字 ^M として認識される)。

vi 上で ^M 文字除去Raw Code(S)Raw Code(T)
あいうえお^M
かきくけこ^M
さしすせそ^M
たちつてと^M
なにぬねの^M
~
~
~
~
:%s/^M//g
  • 先頭の % は、置き換え範囲としてファイル全体を指定するという意味です。
  • s/aaa/bbb/ は、aaa を bbb に置き換えるコマンドです。
  • 最後の g は、ファイル全体にわたって同じ行に aaa が何回現れてもすべて置き換えます。

そうすると末尾の ^M 文字が全て削除されるので、:wq で保存して、vi を終了してください。

終わりに

気付かないうちによく起きるトラブルなので、Windows 上で修正したコンフィグファイル類を Linux 環境で使う場合には、特に注意が必要です。

  • Windows 上で作業したファイルを保存する際に、改行コードを LF 形式で保存するか
  • Windows 上で作業したファイルを Linux へアップロードしてから ^M を削除する

もし、コンフィグファイルに ^M が付いていたりするとサービスが正常に立ち上がらないので、お気をつけください。

因みに、VI で現在開いているファイルの改行文字を表示させたい場合には、:set list を入力します。

そうすると以下のように、タブ文字は ^IUNIX 系の改行は $ で表示されます。

改行文字表示前
あいうえお
    かきくけこ
        さしすせそ
            たちつてと
                なにぬねの
~
~
~
~
:set nolist
改行文字表示後
あいうえお$
^Iかきくけこ$
^I^Iさしすせそ$
^I^I^Iたちつてと$
^I^I^I^Iなにぬねの$
~
~
~
~
:set list

以上、VI エディタでファイルを開くと行末に ^M が表示される でした。