it-swarm.cn

如何用Vim中的换行符替换字符

我正在尝试用新行替换当前文件中的每个,

:%s/,/\n/g 

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

我该怎么办?

如果你像我一样好奇,请检查问题为什么\ r\n是Vim的换行符?

1755
Vinko Vrsalovic

使用\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。

2317
Konrad Rudolph

这是诀窍:

首先,设置vi(m)会话以允许模式匹配特殊字符(即:换行符)。将此行放在.vimrc或.exrc文件中可能是值得的。

:set magic

接下来,做:

:s/,/,^M/g

要获取^M字符,请键入 Control - v 并击中 Enter。在Windows下,做 Control - q, Enter。我记住这些的唯一方法就是记住它们的意义不大:

答:用于表示换行的最差控制字符是什么?

B:q(因为它通常意味着“退出”)或v,因为它很容易输入 Control - c 错误地杀了编辑。

答:就这样。

184
Logan

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


短:

对于foo
\n =换行符(linux/mac上的LF,Windows上的CRLF)
\r =回车(CR)

对于bar
\r =是换行符
\n =空字节。

更长:(用ascii数字)

NUL = 0x00 = 0 = CTRL@
LF = 0x0A = 10 = CTRLJ
CR = 0x0D = 13 = CTRLM

这是 ASCII控制字符 的列表,将它们插入到vim中 CTRLvCTRL---key---
bash或其他unix/linux shell中输入 CTRL---key---。尝试 CTRLM 在bash中,它与击中相同 ENTER,即使Linux系统使用Line Feeds进行行分隔,Shell也意识到了这意味着什么。

要在bash中插入文字,请使用前缀 CTRLv 也会工作。

尝试bash:

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

这使用 ANSI转义序列 ,插入两个^[的via CTRLvESC

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

bash: $'\r': command not found

还记得上面的\r吗? :>

ASCII控制字符 list不同于一个完整的 ASCII符号表 ,在控制字符中,通过它插入控制台/伪终端/ vim CTRL 钥匙(哈哈),可以在那里找到。在C和大多数其他语言中,您通常使用八进制代码来表示这些“字符”。

如果你真的想知道所有这些来自何处: http://www.linusakesson.net/programming/tty/
这是关于这个主题你会遇到的最好的链接,但要注意:有龙。


TL; DR

通常foo = \n,和bar = \r

84
sjas

你需要使用

:%s/,/^M/g

要获取^M字符,请按 Ctrlv 其次是 Enter

50
dogbane

\r可以为您完成这项工作。

33
Lasar

使用Vim在Windows上使用 Ctrl+Q 代替 Ctrl+V

22
grantc

这是我想的方式的最佳答案,但在表格中会更好: https://stackoverflow.com/a/12389839/962394

所以,重写:

您需要使用\r在正则表达式替换中使用换行符(ascii 0x0a,unix换行符),但这是替换所特有的 - 您通常应该继续期望使用\n进行换行,使用\r进行回车。

这是因为vim在替换中使用了\n来表示NIL字符(ascii 0x00)。您可能已经预期NIL会被\0取代,释放\n用于换行的常用,但\0在正则表达式替换中已经有意义,因此它已转移到\n。因此,然后进一步将换行符从\n转换为\r(在正则表达式模式中是回车符,ascii 0x0d)。

字符| ascii代码| C表示|正则表达式匹配|正则表达式替换
 ------------------------- + ------------ + ---- -------------- + ------------- + --------------------- --- 
 nil | 0x00 |\0 |\0 |\n 
换行(unix换行符)| 0x0a |\n |\n |\r 
回车| 0x0d |\r |\r | <未知> 

注意:^M(在Linux上的Ctrl-V Ctrl-M)在正则表达式替换中使用时会插入换行符而不是其他人建议的回车符(我刚尝试过)。

另请注意,vim会根据文件格式设置将换行字符保存到文件时进行转换,这可能会使事情变得混乱。

10
codeshot

从Eclipse中,^M字符可以嵌入到一行中,并且您希望将它们转换为换行符。

:s/\r/\r/g
10
rickfoosusa

但是,如果必须替代,那么下面的事情是有效的

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

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

line1
line2
line3

改为

line1
|-
line2
|-
line3
7
Kiran K Telukunta

如果您需要为整个文件执行操作,还建议您可以从命令行尝试

sed 's/\\n/\n/g' file > newfile
6
Evan Donovan

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

----引用 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”,然后按下“输入”键(释放所有键)。


4
user407749