为啥 \r 是 Vim 的换行符?

Posted

技术标签:

【中文标题】为啥 \\r 是 Vim 的换行符?【英文标题】:Why is \r a newline for Vim?为什么 \r 是 Vim 的换行符? 【发布时间】:2010-09-09 10:37:15 【问题描述】:

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

:%s/%/\r/g

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

:%s/\n/%/g 

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

【问题讨论】:

搜索和替换时% 是什么意思? @qed:默认情况下,:s 只会将替换应用于当前行。 :%s 使其寻址整个文件。 More. +c24w 我认为他指的是斜杠之间的“%”,第一个示例中的“%”在搜索位置,在第二个示例中的替换位置,但是@qed要回答你的问题,那些 '%' 是从字面上匹配的。 【参考方案1】:

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

搜索时

...

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

更换时

...

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

【讨论】:

这个答案对我帮助最大。另外,如需更多信息,:h :s%,尤其是最后一段。 (通过:h :s 我写的更深入 - ***.com/a/18961239/805284 是的,你写的更多,但我认为你没有添加任何材料。【参考方案2】:

来自vim docs on patterns:

\r 匹配

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

【讨论】:

对我来说,混淆点是 \r 和 \n 在使用时表示不同的东西是搜索模式和替换模式。 @dlamblin 是的!看我的回答:)【参考方案3】:

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

所以你不能用\0来表示NULL,所以你用\n 所以你不能用\n来表示\n,所以你用\r。 所以您不能使用\r 来表示\r,但我不知道谁会故意添加该字符。

——☈

【讨论】:

好点!所以这是围绕 \0 的 hack - 对第 0 个嵌套组的反向引用 - 整个正则表达式。这是一个很好的答案,但它让我感到失望,我不能使用 \r 代替......(意思是:插入#(13),例如在“普通”文件中(== unix EOLs)。 好的,答案在 Vim 文档中。只需使用正常的反斜杠转义 \^M 或 \。好的。 ----- 此时将行一分为二(将 键入为 CTRL-V s \r 同上 ------- - s/\r \ 插入回车符 (CTRL-M) (将 键入为 CTRL-V s/\ “另一个方面”?你太谦虚了!准确解释为什么会发生这种情况,对于那些只是说如何解决它的人来说,是一个更好的答案。 +1 老实说,这真的很好地洞察了为什么\n 在搜索和替换模式中具有不同的含义。很棒的答案。【参考方案4】:

:help NL-used-for-Nul

技术细节:

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


【讨论】:

【参考方案5】:

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

【讨论】:

以上是关于为啥 \r 是 Vim 的换行符?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我从 textarea 中提取换行符的方法是使用 \r [重复]

vim 的换行问题

vim 中 <CR> 啥意思?

解决windows文件迁移到linux后行尾有^M的问题

windows与linux换行符

textarea 按回车为啥不换行