如何用Vim中的换行符replace一个字符?
我试图用新行replace当前文件中的每一个:
:%s/,/\n/g
但它插入的东西看起来像^@
而不是实际的换行符。 该文件不在DOS模式或任何东西。
我该怎么办?
编辑:如果你好奇,像我一样,检查问题为什么是\ V换行符? 以及。
使用\r
而不是\n
。
用\n
replace文本中插入一个空字符。 要获得换行符,请使用\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
字符,请键入Control – v并按Enter键 。 在Windows下,执行Control – q , Enter 。 我能记住的唯一方法是记住他们的感觉:
A:用什么来代表换行符是最差的控制字符?
B: 或者
q
(因为它通常意味着“退出”)或者v
因为错误地inputControl – c会很容易,并且会杀死编辑器。答: 做到这一点。
在语法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
= \n
, bar
= \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”(松开所有键)后按“确定”键。