2230

我正在尝试用,新行替换当前文件中的每个:

:%s/,/\n/g 

但它会插入看起来像 a^@而不是实际的换行符。该文件未处于 DOS 模式或任何状态。

我该怎么办?

如果您像我一样好奇,请检查问题Why is \ra newline for Vim? 也是。

4

11 回答 11

2895

使用\r而不是\n.

替换\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。

于 2008-09-16T11:21:03.300 回答
223

这是诀窍:

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

:set magic

接下来,执行:

:s/,/,^M/g

要获取^M角色,请键入Ctrl+V并点击Enter。在 Windows 下,执行Ctrl+ Q, Enter. 我能记住这些的唯一方法是记住它们的意义有多大:

A:用来表示换行符的最差控制字符是什么?

B:要么q(因为它通常意味着“退出”)要么v因为很容易错误地输入Ctrl+C并杀死编辑器。

答:就这样吧。

于 2008-09-25T23:40:19.023 回答
115

在语法s/foo/bar中,\r\n不同的含义,视上下文而定。


短的:

对于foo

\r== "回车" ( CR/ ^M) ==在 Linux/Mac 和Windows上
\n匹配 "换行" ( )LFCRLF

对于bar

\r==LF在 Linux/Mac 上产生,CRLF在 Windows 上
\n== "null byte" ( NUL/ ^@)

在 linux 中编辑最初在 windows 环境中创建并上传(即 FTP/SFTP)的文件(即在网络服务器上)时 -^M您在 vim 中看到的所有 ' 都是CRlinux 不翻译的文件,因为它仅使用LF's 来描绘换行符。


更长(带有 ASCII 数字):

NUL== 0x00 == 0 == Ctrl+ @==^@在 vi​​m 中显示
LF== 0x0A == 10 == Ctrl+ J
CR== 0x0D == 13 == Ctrl+ M==^M在 vi​​m 中显示

这是ASCII 控制字符的列表。Ctrl通过+ V, Ctrl+将它们插入 Vim ---key---

在 Bash 或其他 Unix/Linux shell 中,只需键入Ctrl+ ---key---

在 Bash 中尝试Ctrl+ 。M这与 hit 相同Enter,因为 shell 意识到了它的含义,即使 Linux 系统使用换行符来分隔行。

要在 bash 中插入文字,在它们前面加上Ctrl+V也可以。

在 Bash 中尝试:

echo ^[[33;1mcolored.^[[0mnot colored.

这使用ANSI 转义序列^[通过Ctrl+ V,插入两个Esc

您也可以尝试Ctrl+ V, Ctrl+ M, Enter,这将为您提供:

bash: $'\r': command not found

还记得\r上面的吗?:>

这个ASCII 控制字符列表与完整的ASCII 符号表Ctrl不同,因为可以在其中找到通过键(哈哈)插入控制台/伪终端/Vim 的控制字符。

而在 C 和大多数其他语言中,您通常使用八进制代码来表示这些“字符”。

如果您真的想知道这一切的来源:TTY 已揭开神秘面纱。这是您将遇到的有关此主题的最佳链接,但请注意:有龙。


TL;博士

通常foo=\nbar= \r

于 2013-09-23T14:00:45.340 回答
63

你需要使用:

:%s/,/^M/g

要获取^M字符,请按Ctrl+ ,v然后按Enter

于 2008-09-16T11:30:32.093 回答
44

\r可以为您完成这里的工作。

于 2008-09-16T11:21:34.640 回答
25

在 Windows 上使用 Vim,使用Ctrl+Q代替Ctrl+ V

于 2008-09-16T11:45:40.760 回答
18

这是我认为的最佳答案,但在表格中会更好:

为什么 Vim 是 \ra 换行符?

所以,改写:

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

这是因为 Vim\n在替换中使用了 NIL 字符 (ASCII 0x00)。您可能已经预料到 NIL 会被\0释放\n,因为它通常用于换行,但\0在正则表达式替换中已经有了意义,所以它被转移到\n. 因此,然后进一步将换行符从\nto \r(在正则表达式模式中是回车符 ASCII 0x0D)。

性格 | ASCII码 | C 表示 | 正则表达式匹配 | 正则表达式替换
-------------------------+------------+------------ --------+--------------+------------
无 | 0x00 | \0 | \0 | \n
换行(Unix 换行) | 0x0a | \n | \n | \r
回车 | 0x0d | \r | \r | <未知>

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

另请注意,Vim 将根据其文件格式设置保存到文件时转换换行符,这可能会造成混淆。

于 2015-04-08T12:15:22.903 回答
11

Eclipse中,^M字符可以嵌入一行,您希望将它们转换为换行符。

:s/\r/\r/g
于 2011-09-06T17:53:05.970 回答
9

但是,如果必须替换,则以下内容有效:

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

在上面,每下一行都被下一行替换,然后|-又是一个新行。这用于 wiki 表格。

如果文字如下:

line1
line2
line3

它改为

line1
|-
line2
|-
line3
于 2012-02-07T08:09:42.303 回答
5

这是对我有用的答案。来自这个人:

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


其他一些我必须做的事情,我不记得了,然后不得不抬头看。

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

:%s/look_for/replace_with^M/g

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

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


于 2012-02-03T19:31:15.163 回答
5

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

sed 's/\\n/\n/g' file > newfile
于 2012-02-09T23:01:29.297 回答