我试图用新行替换当前文件中的每一行:

:%s/,/\n/g 

但它插入了一个类似于^@的内容,而不是实际的换行符。该文件未处于DOS模式或任何状态。

我该怎么办?

如果您像我一样好奇,请检查问题:为什么\r是Vim的新线?也


当前回答

在vim编辑器中,以下命令成功替换为新行

:%s/\\n/\r/g

其他回答

诀窍如下:

首先,将Vi(m)会话设置为允许使用特殊字符(例如:换行符)进行模式匹配。在.vimrc或.exrc文件中放入这行代码可能是值得的:

:set magic

接下来,请执行以下操作:

:s/,/,^M/g

要获取^M字符,请键入Ctrl+V并按Enter键。在Windows下,按Ctrl+Q,Enter键。我能记住这些的唯一方法就是记住它们的意义有多小:

A: 用来表示换行符的最差控制字符是什么?B: 要么是q(因为它通常意味着“退出”),要么是v,因为很容易错误地键入Ctrl+C并杀死编辑器。A: 做到这一点。

在Eclipse中,^M字符可以嵌入到一行中,您需要将它们转换为换行符。

:s/\r/\r/g

对于Windows上的Vim,使用Ctrl+Q代替Ctrl+V。

如果您需要对整个文件执行此操作,我还建议您可以从命令行尝试:

sed 's/\\n/\n/g' file > newfile

这是我认为最好的答案,但放在桌子上会更好:

为什么\r是Vim的换行符?

因此,重新编写:

您需要使用\r在正则表达式替换中使用换行符(ASCII 0x0A,Unix换行符),但这是替换所特有的-您通常应该继续使用\r换行符和\r回车符。

这是因为Vim在替换中用于表示NIL字符(ASCII 0x00)。您可能希望NIL改为\0,释放\n用于换行,但\0在正则表达式替换中已经有了意义,因此它被转换为\n。因此,接下来还要将换行符从\n移到\r(在正则表达式模式中,换行符是回车符,ASCII 0x0D)。

Character                | ASCII code | C representation | Regex match | Regex replacement
-------------------------+------------+------------------+-------------+------------------------
nil                      | 0x00       | \0               | \0          | \n
line feed (Unix newline) | 0x0a       | \n               | \n          | \r
carriage return          | 0x0d       | \r               | \r          | <unknown>

注意:^M(Linux上的Ctrl+V Ctrl+M)在正则表达式替换时插入换行符,而不是其他人建议的回车符(我刚刚尝试过)。

还要注意,当Vim根据其文件格式设置保存到文件时,它将转换换行符,这可能会混淆问题。