如何在Vim中用换行符替换一个字符?
我想替换每个,
在由新线当前文件:
:%s/,/n/g
但它会插入看起来像^@
而不是实际换行符。 该文件不在DOS模式或任何东西。
我该怎么办?
如果你很好奇,像我一样,检查问题为什么对于Vim而言, ra是新行? 以及。
使用r
而不是n
。
用n
代替,在文本中插入一个空字符。 要获得换行符,请使用r
。 但是,在搜索换行符时,仍然会使用n
。 这种不对称是由于n
和r
做了些微不同的事情:
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
r
和n
有不同的含义,具体取决于上下文。
对于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
= n
, bar
= r
。
上一篇: How to replace a character by a newline in Vim?
下一篇: Best (and safest) way to merge a git branch into master