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

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

:%s/,/\n/g 

但它插入了一个看起来像^@的东西,而不是一个真正的换行。该文件不是在DOS模式或其他什么情况下。

我应该怎么做?

如果你像我一样好奇,请查看问题Why is \r a newline for Vim?,也可以。

对该问题的评论 (3)
解决办法

使用r而不是n

n'来替代,会在文本中插入一个空字符。要得到一个换行,请使用r。然而,当*搜索*换行时,你仍然要使用n。这种不对称性是由于nr`做的事情略有不同

n匹配行末(换行),而r匹配回车。另一方面,在替换中n插入一个空字符,而r插入一个换行符(更确切地说,它被当作输入的)。这里有一个非交互式的小例子来说明这个问题,使用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字节。

评论(16)

这里有一个技巧。

首先,设置你的vi(m)会话允许用特殊字符(即newline)进行模式匹配。 newline)。) 也许值得把这行放在 .vimrc 或 .exrc 文件中。

:set magic

接下来,做。

:s/,/,^M/g

要获得"^M "字符,键入Control-v</kbd&gt。 然后按Enter。 在Windows下,做Control-q,Enter。 我只有记住这些,才能记住它们的意义有多小。

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

A: _用什么控制字符来表示换行? B: _要么是q(因为它通常意味着"Quit"),要么是v,因为这样很容易打出Control-c 误打误撞,把编辑器打死了。

答:_使其如此。

评论(5)

在语法s/foo/bar中,rn根据上下文有不同的含义。


短。

对于foo:
\ñ = 换行(linux/mac上为LF,windows上为CRLF)
`r = 回车(CR)<br/&gt。

对于bar:
\r = is newline
\n = null byte.

较长。 (带ascii数字)

`NUL` = 0x00 = 0 = CTRL@
`LF` = 0x0A = 10 = CTRLJ
评论(4)

你需要使用

:%s/,/^M/g

要获得^M字符,请按下Ctrlv然后按Enter

评论(1)

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

评论(0)

在Windows上的Vim使用Ctrl+Q</kbd&gt。 来代替Ctrl+V</kbd&gt。

评论(0)

这是我认为的最好的答案,但如果用表格来表示就更好了。 https://stackoverflow.com/a/12389839/962394.

所以,重新措辞。

在regex替换中,你需要使用r/r来使用换行符(ascii 0x0a,unix的换行符),但这是替换中的特殊情况--通常你应该继续使用n/n来换行,使用r/r来回车。

这是因为vim在替换中使用n来表示NIL字符(ascii 0x00)。 你可能会认为NIL应该是0,而不是0,这样就可以把n释放出来,用于通常的换行,但是0在regex替换中已经有了意义,所以它被转移到了n。 因此再进一步也将新行从n移到了r(在regex模式中是回车符,ascii0x0d)。

字符|ascii码|C表示法|regex匹配|regex替换
-------------------------+------------+------------------+-------------+------------------------
nil|0x00|0|0|0|0|n
换行 (unix newline) | 0x0a | 0x0a - 0x0a - 0x0a - 0x0a - 0x0a - 0x0a - 0x0a - 0x0a - 0x0a
0x0d | 0x0d | 0x0d | <未知>

NB.M(Ctrl-V-M on linux) ^M` (linux上为Ctrl-V Ctrl-M)在替换regex时插入一个新行,而不是像其他人建议的那样插入回车(我刚刚试过)。

另外,请注意,当vim根据其文件格式设置保存到文件时,它会翻译换行符,这可能会使事情变得混乱。

评论(0)

从eclipse来看,"^M "字符可以嵌入到一行中,而你想把它们转换为换行符。

:s/\r/\r/g
评论(0)

但是,如果必须要替换的话,那么下面的东西就可以了。

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

在上面的表格中,每一行都用下一行代替,然后用|-代替,再用下一行代替。 这在wiki表格中使用。 如果文本如下。

line1
line2
line3

改为

line1
|-
line2
|-
line3
评论(0)

如果你需要为整个文件做,也有人建议我,你可以从命令行中尝试

sed 's/\\n/\n/g' file > newfile
评论(1)

这就是对我有用的答案。 从这个家伙

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

还有一些事我要做,记不清了,然后要去查。

在vi中,如果要在搜索和替换中插入一个换行符,请执行以下操作。

:%s/look_for/replace_with^M/g 上面的命令将用 "replace_with/n "替换所有的 "look_for "实例(其中/n表示换行)。

要得到"^M",输入组合键 "ctl-V",然后(释放所有键)按 "enter "键。


评论(0)