在 vim 的搜索和替换中,换行符显示为 "^@"。

24

我将一个长谷歌电子表格的单元格复制到了一个文本文件中,该文件是由逗号分隔的电子邮件地址列表。同时,其中也有很多“空”单元格,即被逗号围绕的空格。因此,我可能会得到以下列表:

bob@aol.com, ,john@aol.com, , , , email@email.com

在vim中,当我使用如下命令尝试通过每行一个地址来分隔它们时:

:%s/, /,\n/g

我在逗号后面添加新行时,得到的是"^@"而不是新行。

我知道这与字符集有关,但我不知道该如何修复它。

1个回答

25
:s 的替换字段中,你需要使用 \r 而不是 \n 来表示换行符。
^@ 代表 ASCII 空字符。Vim 在内部使用 \r 表示换行符(即 ^M),而使用 \n 来表示 ASCII 空字符,因此如果在替换中使用 \n,你将得到空字符而不是换行符。详见 :h sub-replace-special。

1
你能解释一下为什么他的\n会显示为^@吗? - Anirudh Ramanathan
5
^@是ASCII的空字符。Vim内部使用\r代表新行(也就是^M),而使用\n代表ASCII的空字符。所以在替换文本中,如果你使用\n,你会得到空字符而不是新行。请参考:h sub-replace-special - Julian
1
@Julian:我认为你应该将那个解释放在答案中。 - Michał Górny
4
Vim 内部不使用任何东西来表示换行,它只有一系列的行,并且在列表项的末尾出现换行符(根据 'fileformat' 选项,可能是 \n\r\n\r)。\r 字符代表它自己,但是在替换字符串中两个 \r 字符代表换行符。\n 表示 NULL 是正确的,甚至有 :h NL-used-for-Nul - ZyX

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接