Vim-如何用两个\ n替换一个新行\ n


34

在vim编辑器中,我想使用vim命令模式将换行符(\ n)替换为两个换行符(\ n \ n)。

输入文件内容:

This is my first line.
This is second line.

我尝试过的命令:

:%s/\n/\n\n/g

它将字符串替换为不需要的字符,因为

This is my first line.^@^@This is second line.^@^@

然后我尝试了以下命令

:%s/\n/\r\r/g

它工作正常。您能解释一下为什么第二条命令可以正常工作吗?



2
仅供参考:还有Vi和Vim(测试版)SE
Dubu 2015年

2
旁注,您不必/用作分隔符。这更具可读性::%s;\n;\n\n;g
DJMcMayhem 2015年

1
搜索\n,替换为\r\r:% s/\n/\r\r/gstackoverflow.com/a/71334/911945
安东塔拉先科

Answers:


47

奇怪的是,\n在vim中进行替换并不意味着换行,而是null。ASCII nul为^@control@)。

从历史上看,vi将^McontrolM)替换为行尾,即换行符。vim添加了一个扩展名\r(如C语言)来表示与相同的含义^M,但是开发人员选择\n替换文本时 mean设置为null 。这与它在搜索(查找换行符)中的用法不一致。

进一步阅读:


7

试试这个:%s/$/^V^M/(这里^VCtrl-V^MCtrl-M-当你键入^V它会打印一个^字符,然后按Backspace键删除它,然后当你键入^M它会出现^M...是Ctrl-V是标准的tty 字面下一个字符-运行命令stty -a来显示您的tty的特殊字符)。


实际上,非常有经验的人会知道从CRLF进行转换所需的知识,这是退出并使用dos2unix或类似方法的替代方法。Ctrl-V用法是第一天的课程。
mckenzm 2015年

5

vim用于\n表示\0内存中的空字符,即vim处理文件如何包含空字符(而vi不能)。

\n在表达式中使用时,仅在缓冲区中使用匹配行尾,而不在字符串中使用换行符。

有关更多详细信息,请参见:h NL-used-for-Null:h CR-used- null


1

经过Neovim(nvim)和Vim版本测试

NVIM v0.3.0
VIM - Vi IMproved 8.1

删除换行符:

cell
allele
rs2981578
fgfr2

在这里,\n匹配换行符(但是要插入换行符,请使用\r):

:'<,'>s/\n/|/g

cell|allele|rs2981578|fgfr2

添加换行符:

不:

cell|allele|rs2981578|fgfr2

:'<,'>s/\n/|/g

cell^@allele^@rs2981578^@fgfr2

^@是LF的变音符号(换行;请参见 http://vimhelp.appspot.com/digraph.txt.html#digraphs-default

是:

cell|allele|rs2981578|fgfr2

:'<,'>s/|/\r/g

cell
allele
rs2981578
fgfr2

要解决OP的问题(如何\n用两个替换一个\n\n),只需添加另一个\r

cell
allele
rs2981578
fgfr2

:'<,'>s/\n/\r\r/g

cell

allele

rs2981578

fgfr2

...即匹配原始换行符(\n),并用两个换行符/回车符()替换\r\r

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.