it-swarm.cn

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

来自问题如何在Vim中替换换行符?。替换新行的文本时必须使用\ r,如下所示

:%s/%/\r/g

但是当替换字符的行尾和换行符时,您可以这样做:

:%s/\n/%/g 

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

241
Vinko Vrsalovic

来自 vim docs on patterns

\r匹配<CR>

\n匹配行尾 - 当在字符串中匹配而不是缓冲文本时,匹配文字换行符。

152
pjz

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

搜索时

...

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

更换时

...

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

185
Limited Atonement

另一个方面是\0,传统上是NULL,在s//\0/中被用来表示“整个匹配的模式”。 (顺便说一下,这是多余的,并且比&更长)。

  • 所以你不能使用\0来表示NULL,所以你使用\n
  • 所以你不能使用\n来表示\n,所以你使用\r
  • 所以你不能使用\r来表示\r,但我不知道谁会故意添加这个char。

-☈

99
rking

:help NL-used-for-Nul

技术细节:

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


47
Aristotle Pagaltzis

首先,打开 :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%

10
syockit