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

:%s/,/\n/g 

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

我该怎么办?

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


当前回答

这是对我有用的答案

----引用使用vi编辑器在替换中插入换行符


还有一些事情我必须做,但我记不住了,然后不得不抬头看。

在vi中,要在搜索和替换中插入换行符,请执行以下操作:

:%s/look_for/replace_with^M/g

上面的命令会将“look_for”的所有实例替换为“replace_with\n”(\n表示换行)。

要获得“^M”,请输入组合键Ctrl+V,然后(释放所有键)按enter键。


其他回答

这是对我有用的答案

----引用使用vi编辑器在替换中插入换行符


还有一些事情我必须做,但我记不住了,然后不得不抬头看。

在vi中,要在搜索和替换中插入换行符,请执行以下操作:

:%s/look_for/replace_with^M/g

上面的命令会将“look_for”的所有实例替换为“replace_with\n”(\n表示换行)。

要获得“^M”,请输入组合键Ctrl+V,然后(释放所有键)按enter键。


使用\r而不是\n。

替换为将在文本中插入一个空字符。要获取换行符,请使用\r。但是,在搜索换行符时,您仍然可以使用\n。这种不对称是由于\n和\r做的事情略有不同:

\n匹配行尾(换行符),而\r匹配回车符。另一方面,在替换中\n插入一个空字符,而\r插入一个换行符(更准确地说,它被视为输入CR)。这里有一个小的非交互式示例来说明这一点,使用Vim命令行特性(换句话说,您可以将以下内容复制并粘贴到终端中以运行它)。xxd显示了结果文件的十六进制转储。

echo bar > test
(echo 'Before:'; xxd test) > output.txt
vim test '+s/b/\n/' '+s/a/\r/' +wq
(echo 'After:'; xxd test) >> output.txt
more output.txt
Before:
0000000: 6261 720a                                bar.
After:
0000000: 000a 720a                                ..r.

换句话说,\n已将字节0x00插入文本;\r已插入字节0x0a。

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

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

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

但如果必须替换,则以下方法有效:

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

在上文中,每一行都被替换为下一行,然后是|-,然后是一行。这在wiki表中使用。

如果文本如下:

line1
line2
line3

更改为

line1
|-
line2
|-
line3