Vimで1文字を改行で置き換える方法

現在のファイルの各 , を改行で置き換えようとしています。

:%s/,/\n/g 

しかし、実際の改行ではなく、^@のようなものが挿入されます。このファイルはDOSモードでも何でもない。

どうしたらいいですか?

私のように好奇心旺盛な方は、質問 Why is \r a newline for Vim? もチェックしてみてください。

ソリューション

Use \\r instead of n.

nで代入すると、テキストにNULL文字が挿入されます。改行を得るには、``rを使います。しかし、改行を検索するときには、やはり \n を使います。この非対称性は、n` とr` が doing slightly different things であることに起因しています。

つまり、n` は行末(改行)にマッチし、rはキャリッジリターンにマッチするのです。一方、代入では、``n は NULL 文字を挿入するのに対し、`r は改行を挿入します(正確には、という入力として扱われます)。これを説明するために、Vim のコマンドライン機能を使った、小さな、非インタラクティブな例を紹介します (言い換えれば、以下の内容をターミナルにコピー&ペーストして実行することができます)。xxd` は結果のファイルのヘックスダンプを示しています。

echo bar > test
(echo 'Before:'; xxd test) > output.txt
vim test '+s/b/\n/' '+s/a/\r/' +wq
(echo 'After:'; xxd test) >> output.txt
more output.txt
Before:
0000000: 6261 720a                                bar.
After:
0000000: 000a 720a                                ..r.

つまり、n`は0x00というバイトを、r`は0x0aというバイトをテキストに挿入したことになります。

解説 (16)

を使用する必要があります。

:%s/,/^M/g

M`の文字を取得するには、Ctrl vの後にEnterを押します。

解説 (1)

ここでの作業は`rが代行してくれます。

解説 (0)