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

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 中的使用不一致,它会找到一个换行符。

进一步阅读:

  • 这并没有回答这个问题。 (4认同)
  • @Jortstek 这要看情况。问题标题问“如何”,但实际问题问“为什么”,并且在这个答案中对此进行了解释。 (2认同)

小智 23

要将 1 个换行符替换为 2 个换行符: :%s/\n/\r\r/g

\n- 搜索中换行,替换中为空

\r- 替换中的换行符

答案就在问题中,作者在标题中问“如何做”,但在内容中问“为什么”……人们进入此页面寻找“如何做”的答案,而您实际上并不认为它会受到质疑。 .我花了一段时间才弄清楚这一点。


Mur*_*sen 9

尝试这个:

%s/$/^V^M/
Run Code Online (Sandbox Code Playgroud)

其中^VCtrl+V^MCtrl+ M

  • 当你输入^V它会打印一个^字符,然后Backspace在它上面,然后当你输入^M它时它会显示为^M
  • Ctrl+V是标准的tty字面下一个字符-运行命令stty -a,以显示您的tty的特殊字符)。


cuo*_*glm 6

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

使用\n在缓冲管线的唯一匹配端,在使用时表达不字符串中的换行。

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


Vic*_*art 6

使用 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) 替换它。