如何在Vim中用换行符替换字符


1967

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

:%s/,/\n/g 

但它会插入看起来像a的^@字符串,而不是实际的换行符。该文件不在DOS模式下或其他任何状态。

我该怎么办?

如果您像我一样好奇,请查看问题,为什么\ ra newline for Vim?也一样


2
堆栈溢出是一个用于编程和开发问题的站点。这个问题似乎与主题无关,因为它与编程或开发无关。请在帮助中心中查看我可以询问哪些主题。也许超级用户Unix&Linux Stack Exchange是一个更好的选择。
jww

5
@jww这个问题已有10岁...似乎太老了,无法迁移。有很多这样的问题,例如:stackoverflow.com/questions/10175812/...
Vinko Vrsalovic

14
@jww vim是程序员常用的工具,有关程序员常用的工具的问题是Stack Overflow中的主题。虽然显然这更适合Vi和Vim
user202729

Answers:


2565

使用\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。


127
/ r被视为按Enter / Return键。它适用于所有平台。
卢卡·马林科


14
我希望这适用于经典vi。在AIX v6.1上,\r不能像这样工作。但是您可以按Ctrl-V Enter代替打字\r,它可以工作。
eksortso 2013年

3
我迟到了。如果\r插入<CR>\n插入null,我该如何用回车替换?
骆马先生2015年

2
@SunnyRaj您确定CR和LF的历史吗?我的印象是,最初LF将纸张向前移动了一排,但没有移动打印头,而CR则移动了打印头,但没有移动纸张。结果,如果您的操作系统在打印之前没有转换输入,则您不能仅使用LF或CR来获取正确的输出。MS DOS使用原始打印机数据作为文本文件格式,Mac OS使用CR并将其转换为打印机的原始格式,而UNIX使用LF并将其转换为打印机的原始格式。
Mikko Rantalainen

210

这是窍门:

首先,设置Vi(m)会话以允许使用特殊字符(即:换行符)进行模式匹配。可能值得将此行放入.vimrc或.exrc文件中:

:set magic

接下来,执行:

:s/,/,^M/g

要获取^M角色,请输入Ctrl+ V并点击Enter。在Windows下,做Ctrl+ QEnter。我唯一能记住这些的方法是记住它们的意义:

答:用来代表换行符的最糟糕的控制字符是什么?

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

答:可以。


9
我在Windows上使用GVim,不需要:set magic(也不在我的〜/ _vimrc中)ctrl-q。只需ctrl-v输入一个简单的后缀即可^M为我创建角色。
克里斯·菲利普斯

5
简历不代表换行;这是“转义下一个文字字符”命令。我不知道Cv是什么助记符,但是有一个原因它在思维上没有映射到换行符。
Jim Stewart

27
Ctrl-v是“ verbatim”的助记符-即,将按下其“ verbatim”键码/字符的下一个键转义。在Windows中粘贴:保持熟悉。Ctrl-Q可能用于“(un)Quote”。无论如何,还是很愚蠢的-但您可以在二进制文件中使用它-例如,通过Ctrl-Z搜索Ctrl-A(我猜是Ascii 1-26)。
Tomasz Gandor

1
Ctrl-C虽然可以取消您返回“普通”模式,但实际上并不会杀死编辑器。Ctrl-V表示逐字记录,Ctrl-Q表示有人错误地加载了$VIMRUNTIME/mswin.vim配置文件。您不需要mswin。只需使用您自己的vimrc即可。
00dani

哇-这太神奇了。我以前sed -n l 一直做到现在。很高兴知道Ctrl-v在vim中可以实现相同的效果。
arpit

98

在语法s/foo/bar\r\n有不同的含义,具体取决于上下文。


短:

对于foo

\ n =换行符(在Linux / Mac上为LF,在Windows上为CR + LF)
\ r =回车(CR)

对于bar

\ r =是换行符
\ n =空字节。

更长(使用ASCII数字):

NUL= 0x00 = 0 = Ctrl+ @
LF= 0x0A = 10 = Ctrl+ J
CR= 0x0D = 13 = Ctrl+M

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

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

在Bash中尝试Ctrl+ MEnter尽管Linux系统使用换行符来进行行定界,但它与hiting一样,因为Shell可以实现含义。

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

在Bash中尝试:

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

这使用ANSI转义序列。将两个^[“通过S Ctrl+ VEsc

您也可以尝试Ctrl+ VCtrl+ MEnter,它会给你这样的:

bash: $'\r': command not found

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

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

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

如果您真的想知道所有这些信息来自何处:TTY变得神秘。这是您会遇到的关于此主题的最佳链接,但请注意:有龙。


TL; DR

通常foo= \nbar= \r


1
所以我很感兴趣您如何用回车符替换字符
codeshot 2015年

2
@codeshot :s/x/^M/g应该可以。插入^M通孔,ctrl-v然后插入ctrl-m
sjas 2015年

3
谢谢sjas,您知道这个问题是有史以来最奇怪的问题之一。1008对该答案进行投票,基本上只不过是“ vim做您发现的事情。这是因为vim做您发现的事情。永远不要忘记vim做您发现的事情。” 我希望能找到样式中有趣字符的代码清单,替换和怪异的原因,以便它容易记住和预测其他类似的怪异。那将得到我的投票。
codeshot

@codeshot ASCII控制字符列表可能会对您有所帮助。请参阅cs.tut.fi/~jkorpela/chars/c0.html以获取更多参考。我将更新答案以包括两个链接。
sjas 2015年

55

您需要使用:

:%s/,/^M/g

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


4
我必须执行<Cv> <Cm>才能获得^ M字符。
Jezen Thomas


24

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


16

这是我思考方式的最佳答案,但在表中会更好:

为什么\ ra newline for Vim?

因此,改写:

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

这是因为Vim \n在替换中表示NIL字符(ASCII 0x00)。您可能曾希望NIL可以\0代替它,以释放\n其通常用于换行的功能,但\0在正则表达式替换中已经具有含义,因此将其更改为\n。因此,然后进一步将换行符也从转换\n\r(在正则表达式模式中为回车符ASCII 0x0D)。

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

注:^MCtrl+ V Ctrl+ M在Linux上)中插入一个正则表达式替换,而不是一个回车时,正如其他人劝换行符(我只是尝试了)。

还要注意,Vim在基于文件格式设置保存到文件时会转换换行符,这可能会引起混乱。



8

但是如果必须替换,则可以进行以下操作:

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

在上面,下一行替换为下一行,然后|-再替换一行。这在Wiki表中使用。

如果文本如下:

line1
line2
line3

改为

line1
|-
line2
|-
line3


5

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

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


我必须做的其他事情,无法记住,然后必须查找。

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

:%s/look_for/replace_with^M/g

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

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


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.