为什么 '\r' (而不是 '\n')可以替换 'vim' 中的换行符?

为什么 '\r' (而不是 '\n')可以替换 'vim' 中的换行符?

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

输入文件内容:

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替换文本。这与它的使用不一致搜索,找到换行符。

进一步阅读:

答案2

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

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

\r- 替换中的换行符

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

答案3

尝试这个:

%s/$/^V^M/

其中^VCtrl+ ,V并且^MCtrl+ M

  • 当您键入时,^V它将打印一个^字符,然后Backspace在其上方,然后当您键入时,^M它将显示为^M
  • +CtrlV标准 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) 替换它。

相关内容