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

我想替换每个,在由新线当前文件:

:%s/,/n/g 

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

我该怎么办?

如果你很好奇,像我一样,检查问题为什么对于Vim而言, ra是新行? 以及。


使用r而不是n

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

n匹配换行符(换行符),而r匹配回车符。 另一方面,在替换中, n插入一个空字符,而r插入一个换行符(更准确地说,它被视为输入<CR>)。 下面是一个小的非交互式示例,用于说明这一点,使用Vim命令行功能(换句话说,您可以将以下内容复制并粘贴到终端中运行)。 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字符,请输入Control-v并按Enter键。 在Windows下,执行Control-q,Enter。 我能记住这些的唯一方法就是记住他们的感觉有多么微不足道:

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

B:或者q (因为它通常意味着“退出”)或v因为错误地输入Control-c并杀死编辑器会非常容易。

答:做到这一点。


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


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

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


过去我经常看到有关这些东西的问题,而在未来的某个时候,几乎没有人会最终知道这些东西......

按照'流行'的要求:

这里是ASCII控制字符的列表,通过CTRLvCTRL --- key ---将它们插入到vim
bash或其他unix / linux shell中,只需键入CTRL --- key ---。 在bash中尝试CTRLM,与敲入ENTER相同,因为shell实现了什么意思,即使Linux系统使用换行符进行行分隔。 只有线进给的控制字符是CTRL-A ,它在bash中绑定到'跳到行首“。

要在bash中插入文字,CTRLv也可以工作。

尝试在bash中:

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

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

你也可以尝试CTRLvCTRLmENTER,它会给你这个:

bash: $'r': command not found

记住从上面的r ? :>

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

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


TL; DR

通常foo = nbar = r

链接地址: http://www.djcxy.com/p/1365.html

上一篇: How to replace a character by a newline in Vim?

下一篇: Best (and safest) way to merge a git branch into master