为什么\ r \ n是Vim的换行符?

时间:2008-09-16 11:34:59

标签: vim

来自问题 How to replace a character for a newline in Vim? 。替换新行的文本时必须使用\ r,如此

:%s/%/\r/g

但是当替换角色的行尾和换行符时,你可以这样做:

:%s/\n/%/g 

本手册的哪一部分记录了这些行为,以及它们背后的原因是什么?

5 个答案:

答案 0 :(得分:185)

来自http://vim.wikia.com/wiki/Search_and_replace

  

搜索时

     

...

     

\n是换行符,\rCR(回车= Ctrl-M = ^M

     

更换时

     

...

     

\r是换行符,\n是空字节(0x00)。

答案 1 :(得分:152)

来自vim docs on patterns

  

\r匹配< CR>

     

\n匹配行尾 -     匹配字符串而不是   缓冲文本文字换行符     字符匹配。

答案 2 :(得分:99)

另一个方面是传入NULL \0 s//\0/表示“整个匹配模式”。 (顺便说一句,这是&)的冗余和长期。

  • 因此,您无法使用\0来表示NULL,因此您使用\n
  • 因此,您无法使用\n表示\n,因此您使用\r
  • 因此,您无法使用\r来表示\r,但我不知道谁会故意添加该字符。

-☈

答案 3 :(得分:47)

:help NL-used-for-Nul

  

技术细节:

     文件中的

<Nul>个字符在内存中存储为<NL>。在显示器中   它们显示为“^@”。翻译是在阅读和写作时完成的   文件。要将<Nul>与搜索模式相匹配,您只需输入CTRL-@或   “CTRL-V 000”。这可能正是您所期望的。在内部   在搜索模式中,字符将替换为<NL>。不寻常的是   键入CTRL-V CTRL-J也会插入<NL>,因此也会搜索<Nul>   在文件中。 {Vi无法处理文件中的<Nul>个字符}


答案 4 :(得分:10)

首先,打开:h :s以查看“更改”文档的“4.2替代”部分。这是命令接受的内容:

:[range]s[ubstitute]/{pattern}/{string}/[flags] [count]

请注意有关patternstring

的说明
  

对于{pattern},请参阅|pattern|
  {string}可以是文字字符串,也可以是字符串   特别;见|sub-replace-special|

所以现在您知道搜索模式和替换模式遵循不同的规则。 如果您点击指向|pattern|的链接,则会转到解释Vim中使用的整个正则表达式模式的部分。

同时,|sub-replace-special|将您带到“4.2替换”的子部分,其中包含替换模式,其中\r表示换行/拆分。

(手册本部分的快捷方式是:h :s%