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

时间:2008-09-16 11:19:39

标签: vim replace escaping newline vi

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

:%s/,/\n/g 

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

我该怎么办?

如果您像我一样好奇,请检查问题 Why is \r a newline for Vim?

11 个答案:

答案 0 :(得分:2304)

使用\r代替\n

\n替换在文本中插入一个空字符。要获取换行符,请使用\r。当搜索换行时,您仍然会使用\n。这种不对称是由于\n\r do slightly different things

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

答案 1 :(得分:184)

这就是诀窍:

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

:set magic

接下来,请执行:

:s/,/,^M/g

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

  

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

     

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

     

答:这样做。

答案 2 :(得分:84)

语法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 = CTRL J
CR = 0x0D = 13 = CTRL M

以下是ASCII control characters的列表,通过 CTRL v CTRL vim > --- ---键。
bash或其他unix / linux shell中,只需输入 CTRL --- key --- 。在bash中尝试 CTRL M ,它与命中 ENTER 相同,因为shell意识到了这意味着什么,即使linux系统使用Line Feeds也是如此行划界。

要在bash中插入文字,用 CTRL v 添加它们也可以。

尝试使用bash:

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

这使用ANSI escape sequences,通过 CTRL v ESC 插入两个^[

您也可以尝试 CTRL v CTRL m ENTER 给你这个:

bash: $'\r': command not found

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

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

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


TL; DR

通常foo = \nbar = \r

答案 3 :(得分:50)

您需要使用

:%s/,/^M/g

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

答案 4 :(得分:33)

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

答案 5 :(得分:22)

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

答案 6 :(得分:10)

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

:s/\r/\r/g

答案 7 :(得分:10)

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

所以,重写:

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

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

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>

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

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

答案 8 :(得分:7)

但是,如果必须替换后续的事情

:%s/\n/\r\|\-\r/g
在上面的每一行中的

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

line1
line2
line3

更改为

line1
|-
line2
|-
line3

答案 9 :(得分:6)

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

sed 's/\\n/\n/g' file > newfile

答案 10 :(得分:4)

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

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