如何在Vim中用换行符替换一个字符
我试图用一个新行来替换当前文件中的每个,
。
:%s/,/\n/g
但它插入了一个看起来像^@
的东西,而不是一个真正的换行。该文件不是在DOS模式或其他什么情况下。
我应该怎么做?
如果你像我一样好奇,请查看问题Why is \r a newline for Vim?,也可以。
1859
11
我试图用一个新行来替换当前文件中的每个,
。
:%s/,/\n/g
但它插入了一个看起来像^@
的东西,而不是一个真正的换行。该文件不是在DOS模式或其他什么情况下。
我应该怎么做?
如果你像我一样好奇,请查看问题Why is \r a newline for Vim?,也可以。
使用
r
而不是n
。用
n'来替代,会在文本中插入一个空字符。要得到一个换行,请使用
r。然而,当*搜索*换行时,你仍然要使用
n。这种不对称性是由于
n和
r`做的事情略有不同。n
匹配行末(换行),而r
匹配回车。另一方面,在替换中n
插入一个空字符,而r
插入一个换行符(更确切地说,它被当作输入的)。这里有一个非交互式的小例子来说明这个问题,使用Vim的命令行功能(换句话说,你可以把下面的内容复制并粘贴到终端来运行)。xxd
显示的是生成文件的十六进制转储。换句话说,
n
在文本中插入了0x00字节;r
插入了0x0a字节。这里有一个技巧。
首先,设置你的vi(m)会话允许用特殊字符(即newline)进行模式匹配。 newline)。) 也许值得把这行放在 .vimrc 或 .exrc 文件中。
接下来,做。
要获得"^M "字符,键入Control-v</kbd>。 然后按Enter。 在Windows下,做Control-q,Enter。 我只有记住这些,才能记住它们的意义有多小。
在语法
s/foo/bar
中,r
和n
根据上下文有不同的含义。短。
对于
foo
:\ñ = 换行(linux/mac上为LF,windows上为CRLF)
`r = 回车(CR)<br/>。
对于
bar
:\r = is newline
\n = null byte.
较长。 (带ascii数字)
`NUL` = 0x00 = 0 = CTRL@`LF` = 0x0A = 10 = CTRLJ
你需要使用
要获得
^M
字符,请按下Ctrlv然后按Enterr
可以在这里为你做工作。在Windows上的Vim使用Ctrl+Q</kbd>。 来代替Ctrl+V</kbd>。
这是我认为的最好的答案,但如果用表格来表示就更好了。 https://stackoverflow.com/a/12389839/962394.
所以,重新措辞。
在regex替换中,你需要使用
r/r
来使用换行符(ascii0x0a
,unix的换行符),但这是替换中的特殊情况--通常你应该继续使用n/n
来换行,使用r/r
来回车。这是因为vim在替换中使用
n
来表示NIL字符(ascii0x00
)。 你可能会认为NIL应该是0
,而不是0
,这样就可以把n
释放出来,用于通常的换行,但是0
在regex替换中已经有了意义,所以它被转移到了n
。 因此再进一步也将新行从n
移到了r
(在regex模式中是回车符,ascii0x0d
)。NB.M
(Ctrl-V-M on linux)
^M` (linux上为Ctrl-V Ctrl-M)在替换regex时插入一个新行,而不是像其他人建议的那样插入回车(我刚刚试过)。另外,请注意,当vim根据其文件格式设置保存到文件时,它会翻译换行符,这可能会使事情变得混乱。
从eclipse来看,"^M "字符可以嵌入到一行中,而你想把它们转换为换行符。
但是,如果必须要替换的话,那么下面的东西就可以了。
在上面的表格中,每一行都用下一行代替,然后用|-代替,再用下一行代替。 这在wiki表格中使用。 如果文本如下。
改为
如果你需要为整个文件做,也有人建议我,你可以从命令行中尝试
这就是对我有用的答案。 从这个家伙
----引用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 "键。