271

来自问题How to replace a character for a newline in Vim? . 替换换行符时必须使用 \r ,如下所示

:%s/%/\r/g

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

:%s/\n/%/g 

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

4

5 回答 5

229

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

搜索时

...

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

更换时

...

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

于 2012-09-12T13:02:55.953 回答
157

来自有关模式的 vim 文档

\r 匹配 <CR>

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

于 2008-09-16T15:16:17.540 回答
132

另一个方面是,\0传统上为 NULL,被认为 s//\0/是“整个匹配的模式”。(顺便说一下,这与 是多余的,并且比 长&)。

  • 所以你不能用\0to 表示NULL,所以你用\n
  • 所以你不能用\nto 表示\n,所以你用\r.
  • 所以你不能用\rto mean \r,但我不知道谁会故意添加那个 char 。

—☈

于 2012-09-12T13:54:48.203 回答
50

:help NL-used-for-Nul

技术细节:

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


于 2008-09-16T11:57:17.643 回答
11

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

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

注意关于pattern和的描述string

{pattern}|pattern|
{string}可以是文字字符串,也可以是
特殊的;见|sub-replace-special|

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

同时,|sub-replace-special|带您进入“4.2 Substitute”小节,其中包含用于替换的模式,其中包括\r换行/拆分。

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

于 2013-12-10T10:28:54.460 回答