如何用Vim中的换行符replace一个字符?

我试图用新行replace当前文件中的每一个:

 :%s/,/\n/g 

但它插入的东西看起来像^@而不是实际的换行符。 该文件不在DOS模式或任何东西。

我该怎么办?

编辑:如果你好奇,像我一样,检查问题为什么是\ V换行符? 以及。

使用\r而不是\n

\nreplace文本中插入一个空字符。 要获得换行符,请使用\r 。 在search换行符时,仍然会使用\n 。 这种不对称是由于\n\r 做了些微不同的事情 :

\n匹配换行符(换行符),而\r匹配回车符。 另一方面,在replace中\n插入一个空字符,而\r插入一个换行符(更确切地说,它被视为input<CR> )。 下面是一个小的非交互式示例,用Vim命令行function来说明这一点(换句话说,您可以将以下内容复制并粘贴到terminal中运行)。 xxd显示结果文件的hexdump。

 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。

诀窍是:

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

 :set magic 

接下来,做:

 :s/,/,^M/g 

要获得^M字符,请键入Controlv并按Enter键 。 在Windows下,执行ControlqEnter 。 我能记住的唯一方法是记住他们的感觉:

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

B: 或者q (因为它通常意味着“退出”)或者v因为错误地inputControlc会很容易,并且会杀死编辑器。

答: 做到这一点。

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


对于foo
\ n =换行符
\ r = CR(回车= Ctrl-M = ^ M)

对于bar
\ r =是新行
\ n =空字节(0x00)。


过去我经常看到有关这种东西的问题,而且在将来几乎没有人会最终知道这些东西。

受“stream行”要求:

这里是ASCII控制字符的列表,通过CTRL v CTRL --- key ---vim插入它们。
bash或者其他的unix / linux shell中inputCTRL --- key --- 。 在bash中尝试CTRL M ,就像敲击回车键一样,尽pipelinux系统使用换行符进行行分隔,但shell实现了这个function。 换行的控制字符是CTRL-A ,它绑定到bash中的“跳到行首”。

要在bash中插入文字, CTRL v也会起作用。

尝试在bash中:

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

这使用ANSI转义序列 ,通过CTRL v ESC插入两个^[ 's。

你也可以尝试CTRL CTRL m ENTER ,这会给你这个:

 bash: $'\r': command not found 

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

ASCII控制字符列表不同于标准的ASCII符号表 ,在那里可以find通过CTRL键(haha)插入控制台/伪terminal/ vim的控制字符。 而在C和大多数其他语言中,通常使用八进制代码来表示这些“字符”。

如果你真的想知道这些来自哪里: http : //www.linusakesson.net/programming/tty/ 。
这是你会遇到这个话题的最好的链接,但要小心:有龙。


TL; DR

通常foo = \nbar = \r

你需要使用

 :%s/,/^M/g 

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

\r可以在这里为你做这项工作。

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

从日食中, ^M字符可以embedded一行,并且你想把它们转换成换行符。

 :s/\r/\r/g 

但是,如果一个人不得不replace下面的东西的作品

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

在上面的每一行下一行代入下一行,然后| – 再次下一行。 这在维基表中使用。 如果文字如下:

 line1 line2 line3 

更改为

 line1 |- line2 |- line3 

如果你需要做一个完整的文件,我也build议你可以从命令行尝试

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

这是我认为的最好的答案,但它会在表中更好: https : //stackoverflow.com/a/12389839/962394 。

所以,改写:

您需要使用\r在正则expression式replace中使用换行符(ascii 0x0a ,unix换行符),但这是replace特有的 – 您通常应该继续期望使用换行符\n和换行符\r

这是因为vim在replace中使用\n来表示NIL字符(ascii 0x00 )。 你可能预期NIL已经被replace为\0 ,释放\n用于换行的通常用法,但\0在正则expression式replace中已经有了一个意义,所以它被转移到了\n 。 因此,进一步将换行符从\n移到\r (在正则expression式中是换行符,ascii 0x0d )。

字符|  ascii码|  C表示| 正则expression式匹配| 正则expression式replace
 ------------------------- + ------------ + ----------- ------- + ------------- + ------------------------
无|  0x00 |  \ 0 |  \ 0 |  \ n
换行(unix换行)|  0x0a |  \ n |  \ n |  \ r
回车|  0x0d |  \ r |  \ r |  <未知>

注意: ^M (在linux上的Ctrl-V Ctrl-M)在正则expression式replace中插入一个换行符,而不是像其他人所build议的那样(我刚刚尝试过)插入换行符。

还要注意的是,当vim根据文件格式设置保存到文件时,它会转换换行符,这可能会造成混淆。

下面是为我工作的答案。 从这个家伙

—-引用http://jaysonlorenzen.wordpress.com/2009/04/28/use-vi-editor-to-insert-newline-char-in-replace/


还有一些我必须做的,不记得然后不得不仰视。

在vi中,在search和replace中插入换行符,执行以下操作:

:%s / look_for / replace_with ^ M / g上面的命令会将“look_for”的所有实例replace为“replace_with \ n”(带\ n表示换行符)

获得“^ M”,然后input组合键“ctl-V”(松开所有键)后按“确定”键。