为啥 \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
是换行符,\r
是CR
(回车 =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 或 \\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]
注意关于pattern
和string
的描述
对于
pattern
,请参阅|pattern|
。string
可以是文字字符串,也可以是其他东西 特别的;见|sub-replace-special|
。
所以现在您知道搜索模式和替换模式遵循不同的规则。
如果您点击|pattern|
的链接,它将带您进入解释 Vim 中使用的整个正则表达式模式的部分。
同时,|sub-replace-special|
带您进入“4.2 Substitute”小节,其中包含用于替换的模式,其中\r
用于换行/拆分。
(这部分手册的快捷方式是:h :s%
)
【讨论】:
以上是关于为啥 \r 是 Vim 的换行符?的主要内容,如果未能解决你的问题,请参考以下文章