2017-01-18 89 views
2

在進行字符串替換(:s/x/y/)時,Vim對待^M似乎存在某種不對稱。^v與vim替換字符串

也許一個例子是最好的;說我們有這個文本文件:

foo:bar:biz 

我想分裂成行。這工作得很好:

:s/:/^M/g 

(注意:^M產生通過鍵入Ctrl-VEnter

這導致在文本文件中:現在

foo 
bar 
baz 

,如果我撤消,然後再試一次,我注意到這是的不是工作:

:s/:/\n/g 

這裏,得到的文本是:

foo^@bar^@biz 

也就是說,它們是由ASCII NUL字節(0x00)加盟。

問題1:爲什麼用\n代替NUL字節?

現在,我想「好的,我猜^M被用作Vim的'行分隔符'字符,我可以使用它'」。

所以我做的另一項實驗中,首先是一個項目每行文本文件:

foo 
bar 
baz 

,現在,我想用冒號加入他們的行列,所以它看起來像第一個化身,以上。

於是我運行:

:%s/^M/:/ 

但這種失敗,出現錯誤:

​​

然而,這個命令不會工作:

:%s/\n/:/ 

生產:

foo:bar:biz: 

(我可以擺脫尾隨冒號自己的)

所以問題2:爲什麼在這種情況下,如果^M\n工作?

最終,問題3:爲什麼會出現取決於它是否是一個字符串替換命令的左手或右手邊\n^M之間的這種不對稱?

+0

相關:http://stackoverflow.com/q/71323/5048383 – dNitro

回答

2

當搜索時,\n是一個可以方便地匹配任何類型「行尾」的「全部捕獲」原子:CRLF,CRLF

更換時,\n<Nul>,並表示爲^@

替換時,\r是當前fileformat的合法「行尾」。

總之,習慣了這種模式並進行:

:s/\n/\r 

:help NL-used-for-Nul和。

+0

感謝您的幫助鏈接。看起來最基本的問題是,///的「搜索」和「替換」部分使用不同的語法,這就是它的方式。未來搜索者的其他幫助頁面:':help sub-replace-special',':help pattern',':help:s'。對於替換方面,'\ r'和'^ M'具有相同的含義(幫助頁面用「idem」表示,我覺得它有點奇怪)。 – jwd