在编辑器中,我想使用命令模式vim
将换行符 ( \n
) 替换为两个换行符 ( )。\n\n
vim
输入文件内容:
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
你能解释一下为什么第二个命令可以正常工作吗?
答案1
奇怪的是,\n
在 vim 中替代品并不意味着换行,而是空。 ASCII nul 为^@
( Ctrl+ @)。
从历史上看, vi 取代^M
( Ctrl+ M) 作为行结束符,即换行符。 vim 添加了一个扩展\r
(如 C 语言)以与 相同^M
,但开发人员选择\n
在以下情况下将 Mean 设为 null替换文本。这与它的使用不一致搜索,找到换行符。
进一步阅读:
- 搜索和替换(Vim 维基)
- vim 将字符替换为
\n
答案2
要将 1 个换行符替换为 2 个换行符:
:%s/\n/\r\r/g
\n
- 搜索中换行,替换中为空
\r
- 替换中的换行符
答案就在问题中,作者在标题中问“如何做”,但在内容中问“为什么”……人们进入此页面寻找“如何做”的答案,而您实际上并不认为它会受到质疑。我花了一段时间才弄清楚。
答案3
尝试这个:
%s/$/^V^M/
其中^V
是Ctrl+ ,V并且^M
是Ctrl+ M。
- 当您键入时,
^V
它将打印一个^
字符,然后Backspace在其上方,然后当您键入时,^M
它将显示为^M
- +Ctrl是V标准 tty字面上的下一个字符 - 运行命令
stty -a
来显示你的 tty 的特殊字符)。
答案4
使用 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
) 替换它。