为什么\ raim的换行?

Vin*_*vic 248 vim

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

:%s/%/\r/g
Run Code Online (Sandbox Code Playgroud)

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

:%s/\n/%/g 
Run Code Online (Sandbox Code Playgroud)

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

Lim*_*ent 197

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

搜索时

...

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

更换时

...

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

  • 这个答案对我帮助最大.另外,有关更多信息,请输入`:h:s%`,尤其是最后一段.(通过`:h:s`) (6认同)

pjz*_*pjz 156

模式的vim文档:

\r 匹配<CR>

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

  • 对我来说,混淆点是\ r和\n在使用时表示不同的东西是搜索模式和替换模式. (38认同)
  • @dlamblin是的!看我的答案:) (3认同)

rki*_*ing 107

对此的另一个方面是,\0传统上为NULL, s//\0/用于表示"整个匹配模式".(顺便说一句,这是多余的,并且比...更长&).

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

-☈

  • "另一个方面"?你太谦虚了!精确地解释_Why_这对于所有只是说_how_解决它的人来说是一个很好的答案.+1 (14认同)
  • 好的,答案在Vim文档中.只需使用正常的反斜杠转义\ ^ M或\ <CR>.尼斯.----- <CR>此时分为两行(将<CR>键入CTRL-V <Enter>)*s <CR>*\r \n idem --------*s /\r*\<CR>插入回车符(CTRL-M)(键入<CR>为CTRL-V <Enter>)*s /\<CR>* (3认同)

Ari*_*zis 47

:help NL-used-for-Nul

技术细节:

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



syo*_*kit 10

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

:[range]s[ubstitute]/{pattern}/{string}/[flags] [count]
Run Code Online (Sandbox Code Playgroud)

请注意关于pattern和的描述string

为了{pattern}|pattern|.
{string}可以是文字字符串,或
特殊的东西; 看|sub-replace-special|.

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

同时,|sub-replace-special|带您进入"4.2替代"的小节,其中包含替换模式,其中包括\r换行/拆分.

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