协慌网

登录 贡献 社区

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

我想替换每个,在由新线当前文件:

:%s/,/\n/g

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

我该怎么办?

如果你像我一样好奇,请检查问题为什么 \ rat 换行?同样。

答案

使用\r而不是\n

\n替换在文本中插入一个空字符。要获取换行符,请使用\r 。但是,在搜索换行符时,您仍然会使用\n 。这种不对称是由于\n\r 确实略有不同

\n匹配行尾(换行符),而\r匹配回车符。另一方面,在替换中\n插入空字符,而\r插入换行符(更准确地说,它被视为输入 )。这是一个小的非交互式示例,使用 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 - qEnter 。我能记住这些的唯一方法就是记住它们的意义:

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

B: 要么是q (因为它通常意味着 “退出”)要么是v因为很容易输入Control - c错误并杀死编辑器。

答: 这样做。

在语法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 控制字符列表,通过CTRL v CTRL --- key ---将它们插入到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 转义序列 ,通过CTRL v ESC插入两个^[ 's。

您也可以尝试按CTRL v CTRL m ENTER ,这将为您提供:

bash: $'\r': command not found

记得上面的\r ? :>

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

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


TL; DR

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