恥は/dev/nullへ by 初心者

プログラミング素人がのろのろと学んだことをつづっています♪

Vimで改行コードを修正する

Windowsで作成したファイルをLinux上で加工する際に改行コードを変更することがありますが、しばらくやっていないと忘れてしまいます(汗)。 そんなわけで、知識の整理を兼ねて備忘録を残すことにしました。


基本事項(改行コード)

OS 種類 正規表現 制御文字表現
WindowsDOS CRLF \r\n ^M ^J
MacOS9以前) CR \r ^M
UNIX LF \n ^J

OS X以降のMacではUNIXと同じくLF。


CRLFからLFに変更

Windowsで作成したファイルをLinuxで開くと、CRの部分が ^M と表示されます。 Vimでファイルを開いてこれを取り除く場合、

%s/^M//g

としますが、 ^Mが表示されていない場合があります。

そういう時は改行コードを指定してファイルを開きます。

:e ++ff=unix ファイル名

既にファイルを開いている場合は、ファイル名を指定せずに以下のようにします。

:e ++ff=unix

こうすると、LFだけが改行コードと見なされます。

LFは改行コードなので可視化されない(表示されない)ままです。 一方、CRは改行コードではないものとして扱われるので、可視化されます(表示されます)。

というわけで、各行の末尾にCRを表す ^M という文字が現れます。これを

%s/^M//g

として、除去します。


M(制御文字)の入力

vim上で ^Mを入力する場合、次のようにします。

CTRL + V    CTRL + M

これは、シェルで制御文字を入力する場合に以下のようにするのと同じです。

CTRL + V  制御文字


改行コードを指定してファイルを開く

改行コードを指定してファイルを開くには

:e ++ff=unix

のほかに、次のものがあります。


1.CRを改行コードと見なしてファイルを開く場合

:e ++ff=mac

Windowsで作成したファイルに対してこのようにした場合、CRが改行コードと見なされ、LFは改行コードと見なされません。 その結果、LFが可視化されます( ^J が表示されます)。


2.CRLFを改行コードと見なしてファイルを開く場合

:e ++ff=dos

こうすると、CRもLFも改行コードと見なされるので、いずれも可視化されません( ^Mも ^Jも表示されません)。


vimのヘルプからの引用

:e ++ff=unix

の「++」について、vimのヘルプには次のように書かれています。

引数のうち [++opt] はオプション 'fileformat', 'fileencoding' または
'binary' の値を、そのコマンドに限ってある値に指定し、不正な文字への対応を指定
するために使われる。指定の形式は次の通り。 
        ++{optname}
または
        ++{optname}={value}

{optname} は次のうちのどれか:   ++ff ++enc ++bin ++nobin ++edit
    ff    または fileformat     'fileformat'    を指定
    enc   または encoding       'fileencoding'  を指定
    bin   または binary         'binary'        を指定
    nobin または nobinary       'binary'        を無効にする
    bad                         不正な文字への対応を指定する
    edit                        :read 用。ファイルを編集するときと同じように
                                オプションの値を保つ。

{value} に空白を含めてはいけない。値は、そのオプションに対して適切なものなら何
でもよい。例:
        :e ++ff=unix
こうすると 'fileformat' を "unix" に設定して同じファイルを編集し直す。

        :w ++enc=latin1 newfile
こうするとカレントバッファの内容を latin1 の文字コードで "newfile" に書き出す。

ファイルに書き込むときに与えられるメッセージで、'fileencoding' もしくは ++enc
で指定した値が 'encoding' と異なるときは、"[変換済み]" が表示される。

引数 [++opt] は空白で区切って複数指定してもよい。それらはみな引数 +cmd より
前に指定しなければならない。


次に、ff(fileformat)というオプションについては、次のように書かれています。

オプション 'fileformat' はファイルに対して <EOL> の形式を設定する。
'fileformat'    <EOL>の文字           形式の名称
  "dos"         <CR><NL> または <NL>  DOS形式           DOS-format
  "unix"        <NL>                  Unix形式          Unix-format
  "mac"         <CR>                  Mac形式           Mac-format
以前はオプション 'textmode' が使われていた。現在ではそれは時代遅れである。

ファイルを読み込むときに、上で述べた文字は <EOL> として解釈される。DOS 形式
(Win32 での既定値) では、<CR><NL> と <NL> の両方が <EOL> と解釈される。Note
DOS 形式でファイルを保存するときには、<NL> 1 個ごとに対して <CR> が追加される
ことに注意。file-read も参照。

ファイルを書き込むときには、上で述べた文字が <EOL> として使われる。DOS形式では
<CR><NL> が使われる。DOS-format-write も参照。

DOS 形式でファイルを読み込んで、Unix 形式でそれを保存することも可能である。
('fileformats' が "dos" を含んでいると仮定すると) 以下の操作は全ての <CR><NL>
を <NL> で置き換えることになる。
        :e ファイル
        :set fileformat=unix
        :w
('fileformats' の値に "unix" が含まれているとき) Unix形式でファイルを読み込ん
で、DOS形式で保存すると、<NL> は全て <CR><NL> で置き換えられる。
        :e ファイル
        :set fileformat=dos
        :w

新しいファイルの編集を開始したときオプション 'fileformats' の値が空でないなら
ば (それがデフォルト)、Vim はファイルが指定された形式で改行されているかどうか
検出を試みる。値が "unix,dos" であるときは、Vim は1個の <NL> (Unix と Amiga 形
式) か <CR><NL> の組 (MS-Windows 形式) が使われるものとして行を調べる。全ての
行が <CR><NL> で終わっているときだけ、'fileformat' の値は "dos" に設定され、そ
うでなければ "unix" に設定される。'fileformats' の値が "mac" を含んでいて、ファ
イルに <NL> が1個も見つからないときは、'fileformat' の値は "mac" に設定される。

'fileformat' の値が MS-Windows 以外のシステム上で "dos" に設定されると、普通で
ないことが起きていることを気づかせるために、メッセージ "[dosフォーマット]" が
表示される。'fileformat' の値が "unix" であると、MS-Windows システムでは
"[unixフォーマット]" のメッセージが表示される。'fileformat' の値が "mac" であ
ると、Macintosh以外の全てのシステムでは、メッセージ "[macフォーマット]" が表示
される。

オプション 'fileformats' の値が空で、DOS 形式が使用されているが、ファイルを読
み込んでいるときにいくつかの行が <CR><NL> で終わっていなかったならば、ファイル
のメッセージ内に "[CR無]" が含まれる。
'fileformats' の値が空で、Mac 形式が使用されているが、ファイルを読み込んでいる
ときに <NL> が見つかったならば、ファイルのメッセージ内に "[NL無]" が含まれる。


ちなみに、この中に登場する

:set fileformat=unix

は、次のように短縮できます。

:se ff=unix


追記

ネット上をさまよっていたら以下のページを見つけました。
エンコーディングや改行コードを操作する方法がまとめられていて便利です。

neos21.net