Rag*_*dra 51 vim regular-expression vi-mode
在 vim 编辑器中,我想使用 vim 命令模式用两个换行符 (\n\n) 替换换行符 (\n)。
输入文件内容:
This is my first line.
This is second line.
Run Code Online (Sandbox Code Playgroud)
我试过的命令:
:%s/\n/\n\n/g
Run Code Online (Sandbox Code Playgroud)
它用不需要的字符替换字符串作为
This is my first line.^@^@This is second line.^@^@
Run Code Online (Sandbox Code Playgroud)
然后我尝试了以下命令
:%s/\n/\r\r/g
Run Code Online (Sandbox Code Playgroud)
它工作正常。你能解释为什么它可以用第二个命令正常工作吗?
Tho*_*key 63
奇怪的是,\n
在 vim 中替换并不意味着换行,而是 null。ASCII 空值是^@
( Ctrl+ @)。
历史上,vi 将^M
( Ctrl+ M)替换为行尾,即换行符。vim 添加了一个扩展\r
(如 C 语言)来表示与 相同^M
,但开发人员\n
在替换文本时选择使表示为 null 。这与其在search 中的使用不一致,它会找到一个换行符。
进一步阅读:
\n
小智 23
要将 1 个换行符替换为 2 个换行符:
:%s/\n/\r\r/g
\n
- 搜索中换行,替换中为空
\r
- 替换中的换行符
答案就在问题中,作者在标题中问“如何做”,但在内容中问“为什么”……人们进入此页面寻找“如何做”的答案,而您实际上并不认为它会受到质疑。 .我花了一段时间才弄清楚这一点。
尝试这个:
%s/$/^V^M/
Run Code Online (Sandbox Code Playgroud)
其中^V
是Ctrl+V和^M
是Ctrl+ M。
^V
它会打印一个^
字符,然后Backspace在它上面,然后当你输入^M
它时它会显示为^M
stty -a
,以显示您的tty的特殊字符)。vim
用于\n
表示\0
内存中的空字符,即vim
句柄文件如何包含空字符(而vi
不能)。
使用\n
在缓冲管线的唯一匹配端,在使用时表达不字符串中的换行。
有关更多详细信息,请参阅:h NL-used-for-Null和:h CR-used-for-NL。
使用 Neovim ( nvim
) 和Vim
版本进行测试
NVIM v0.3.0
VIM - Vi IMproved 8.1
Run Code Online (Sandbox Code Playgroud)
删除换行符:
cell
allele
rs2981578
fgfr2
Run Code Online (Sandbox Code Playgroud)
在这里,\n
匹配换行符(但是要插入换行符,请使用\r
):
:'<,'>s/\n/|/g
cell|allele|rs2981578|fgfr2
Run Code Online (Sandbox Code Playgroud)
添加换行符:
没有:
cell|allele|rs2981578|fgfr2
:'<,'>s/\n/|/g
cell^@allele^@rs2981578^@fgfr2
Run Code Online (Sandbox Code Playgroud)
^@
是 LF 的变音符号(换行;请参阅
http://vimhelp.appspot.com/digraph.txt.html#digraphs-default)
是的:
cell|allele|rs2981578|fgfr2
:'<,'>s/|/\r/g
cell
allele
rs2981578
fgfr2
Run Code Online (Sandbox Code Playgroud)
要解决OP的问题(如何用\n
两个替换一个\n\n
),只需添加另一个\r
:
cell
allele
rs2981578
fgfr2
:'<,'>s/\n/\r\r/g
cell
allele
rs2981578
fgfr2
Run Code Online (Sandbox Code Playgroud)
...即匹配原来的换行符( \n
),并用两个换行符/回车符( \r\r
) 替换它。