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

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

:%s/,/\n/g 

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

我该怎么办?

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

Vinko Vrsalovic asked 2018-12-26T09:03:09Z
11个解决方案
2160 votes

使用\n而不是\r

替换为\n在文本中插入空字符。 要获取换行符,请使用\r。但是,在搜索换行符时,您仍然可以使用\n。 这种不对称是由于\rxxd的事情略有不同:

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

Konrad Rudolph answered 2018-12-26T09:03:30Z
174 votes

这是诀窍:

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

:set magic

接下来,做:

:s/,/,^M/g

要获取q字符,请键入Control-v并按Enter键。 在Windows下,执行Control-q,Enter。 我能记住这些的唯一方法就是记住它们的意义:

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

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

答:这样做。

Logan answered 2018-12-26T09:04:17Z
72 votes

在语法foo中,\nbar具有不同的含义,取决于上下文。


短:

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

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

更长:(用ascii数字)

foo = 0x00 = 0 = CTRL @
\n = 0x0A = 10 = CTRLJ
bar = 0x0D = 13 = CTRLM

这是一个ASCII控制字符列表,通过CTRL CTRL ---键---将它们插入foo
\n或其他unix / linux shell中只需输入CTRL --- key ---。 尝试使用bash中的CTRLM,它与命中ENTER一样,因为shell实现了意思,即使linux系统使用Line Feeds进行行分隔。

要在bash中插入文字,使用CTRLv前置它们也可以。

尝试bash:

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

这使用ANSI转义序列,通过CTRLvESC插入两个foo

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

bash: $'\r': command not found

还记得上面的foo吗?产品:>

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

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


TL; DR

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

sjas answered 2018-12-26T09:06:19Z
46 votes

你需要使用

:%s/,/^M/g

要获取^M字符,请按Ctrl v,然后按Enter键

dogbane answered 2018-12-26T09:06:43Z
29 votes

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

Lasar answered 2018-12-26T09:07:03Z
20 votes

使用Windows上的Vim,使用Ctrl + Q代替Ctrl + V.

grantc answered 2018-12-26T09:07:23Z
8 votes

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

:s/\r/\r/g
rickfoosusa answered 2018-12-26T09:07:43Z
6 votes

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

所以,重写:

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

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

character                | ascii code | C representation | regex match | regex replacement
-------------------------+------------+------------------+-------------+------------------------
nil                      | 0x00       | \0               | \0          | \n
line feed (unix newline) | 0x0a       | \n               | \n          | \r
carriage return          | 0x0d       | \r               | \r          | <unknown>

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

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

codeshot answered 2018-12-26T09:08:27Z
5 votes

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

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

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

line1
line2
line3

改为

line1
|-
line2
|-
line3
Kiran Telukunta answered 2018-12-26T09:08:56Z
4 votes

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

sed 's/\\n/\n/g' file > newfile
Evan Donovan answered 2018-12-26T09:09:16Z
2 votes

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

----引用[http://jaysonlorenzen.wordpress.com/2009/04/28/use-vi-editor-to-insert-newline-char-in-replace/]


我必须做的其他事情,不记得,然后必须抬头。

在vi中,在搜索和替换中插入换行符,请执行以下操作:

:%S / look_for/ replace_with^ M/克上面的命令将用“replace_with \ n”替换“look_for”的所有实例(\ n表示换行符)

要获得“^ M”,请输入组合键“ctrl-V”,然后按下“输入”键(释放所有键)。


answered 2018-12-26T09:09:58Z
translate from https://stackoverflow.com:/questions/71323/how-to-replace-a-character-by-a-newline-in-vim