2017-01-18 6 views
2

文字列置換(:s/x/y/)を実行するときに、Vimが^Mを処理する方法にある種の非対称性があるようです。^vimの文字列置換で m対 n

おそらく一例が最適です。

私はこれを行に分割したいと思います。これは正常に動作します:

:s/:/^M/g 

^Mが生成されることに注意しCtrl-Vを入力して、Enter

これは、テキストファイルになり

:私はそれを元に戻して、もう一度しようとした場合、

foo 
bar 
baz 

今私はこれがではなく、であることに気付きます。

:s/:/\n/g 
ここ

は、結果のテキストは次のとおりです。

言うことです
foo^@bar^@biz 

は、それらがASCII NULバイト(0x00)によって結合されています。

質問1:なぜ\nを交換するとNULバイトになるのですか?

ここで、私は「^Mが何らかの形で「行区切り文字」として使われていると思いますが、私はそれを使って作業することができます。

だから私は、別の実験では、1項目あたりの行のテキストファイルで始まるん、

foo 
bar 
baz 

そして今、私はコロンでそれらに参加したいので、それは非常に最初の化身のように見えます上記。

だから私は実行します。

:%s/^M/:/ 

しかし、これは失敗し、エラーで:

​​

ただし、このコマンドが作業を行います。

:%s/\n/:/ 

生産:

foo:bar:biz: 

は(私は、末尾のコロン自分自身を取り除くことができます)

ので質問2^Mにはないこの場合、中\n作業を行うのはなぜ?

、最終的には、質問3:なぜ\n^M間のこの非対称性は、それが文字列の置換コマンドの右または左側にありますかどうかに応じてありますか? CRLFCR、およびLF

+0

関連:http://stackoverflow.com/q/71323/5048383 – dNitro

答えて

2

検索、\nは便利な「エンド・オブ・ライン」のいずれかの種類に一致する「キャッチオール」原子です。

\n<Nul>であり、^@と表されます。

交換時には、現在のfileformatの場合、\rが有効な「行末」です。要するに

、このパターンに使用し、上運ぶ得る:

:s/\n/\r 

:help NL-used-for-Nulとを参照してください。

+0

ヘルプリンクありがとうございます。根本的な問題は、 '' s /// 'の '' search' 'と '' replace' '部分が異なる構文を使用していることです。それはそれだけです。将来のサーチャーのための他のヘルプページ: ':help sub-replace-special'、':help pattern'、 ':help:s'。置き換え側では、 '\ r'と'^M'は同じ意味を持っています(ヘルプページで "idem"と表示されますが、少し奇妙です)。 – jwd