来自问题How to replace a character for a newline in Vim? . 替换换行符时必须使用 \r ,如下所示
:%s/%/\r/g
但是当替换一个字符的行尾和换行符时,你可以这样做:
:%s/\n/%/g
手册的哪一部分记录了这些行为,它们背后的原因是什么?
来自问题How to replace a character for a newline in Vim? . 替换换行符时必须使用 \r ,如下所示
:%s/%/\r/g
但是当替换一个字符的行尾和换行符时,你可以这样做:
:%s/\n/%/g
手册的哪一部分记录了这些行为,它们背后的原因是什么?
从http://vim.wikia.com/wiki/Search_and_replace:
搜索时
...
\n
是换行符,\r
是CR
(回车=Ctrl-M
=^M
)更换时
...
\r
是换行符,\n
是一个空字节 (0x00
)。
来自有关模式的 vim 文档:
\r
匹配 <CR>
\n
匹配行尾 - 当匹配字符串而不是缓冲区文本时,匹配文字换行符。
另一个方面是,\0
传统上为 NULL,被认为
s//\0/
是“整个匹配的模式”。(顺便说一下,这与 是多余的,并且比 长&
)。
\0
to 表示NULL
,所以你用\n
\n
to 表示\n
,所以你用\r
.\r
to mean \r
,但我不知道谁会故意添加那个 char 。—☈
: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>
文件中的字符}
首先,打开: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%
)