为什么\ ra newline for Vim?


253

来自问题如何在Vim中替换换行符?。像这样在换行符替换文本时必须使用\ r

:%s/%/\r/g

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

:%s/\n/%/g 

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


1
%搜索和更换时有什么用?
2013年

7
@qed:默认情况下,:s只会将替换应用于当前行。:%s使它处理整个文件。更多
c24w 2014年

3
+ c24w我认为他指的是斜线之间的'%',第一个示例是'%'在搜索位置,第二个示例是在替换位置,但是@qed回答了您的问题,这些'%从字面上匹配。
RastaJedi

Answers:


154

vim docs上的pattern

\r 符合<CR>

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


41
对我而言,混淆点是\ r和\ n在使用时表示搜索模式和替换模式的含义不同。
dlamblin 2012年

3
@dlamblin是的!见我的回答:)
有限赎罪


113

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

  • 所以你不能用\0意思是NULL,所以你用\n
  • 所以你不能用\n\n,而是用\r
  • 因此,您不能\r用来表示\r,但我不知道谁会故意添加该char。

—☈


1
好点子!因此,这是围绕\ 0-向第0个嵌套组的反向引用-整个正则表达式的黑客。这是一个很好的答案,但令我失望的是,我不能用\ r代替...(这意味着:例如在“普通”文件(== unix EOL)中插入#(13)。
Tomasz Gandor

3
好的,答案在Vim文档中。只需使用正常的反斜杠转义\ ^ M或\ <CR>。真好 ----- <CR>在这一点上一分为二(将<CR>输入为CTRL-V <Enter>) s <CR> \ r idem -------- s / \ r \ < CR>插入回车符(CTRL-M)(将<CR>输入为CTRL-V <Enter>) s / \ <CR>
Tomasz Gandor

16
“另一方面”?你太谦虚了!确切地解释为什么会发生,这为所有仅说如何解决问题的人提供了一个更好的答案。+1
underscore_d

老实说,这真是对为什么\n在搜索和替换模式中具有不同含义的深刻见解。很棒的答案。
ZeroKnight,

47

:help NL-used-for-Nul

技术细节:

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



10

首先,打开: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替换”小节,其中包含替换模式,其中包括\r换行/分隔符。

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.