我有一段时间没有在Unix系统中使用过vim,但是我记得没有\ r \ n,它始终是\ n。
我在windows下使用gVim,当我搜索换行符号时,我使用\ n。搜索\ r \ n不返回任何内容。但当我替换我必须使用\ r的字符。 \ n给我^ @
有谁能解释这里发生了什么?
答案 0 :(得分:25)
看起来你在问两件事。其中一个问题是\r
与\n
,其他人已经介绍过。
另一个问题是替换右侧的\n
。如果您查看:h s/\n
,则表示替换的替换部分中的\n
会插入<NUL>
/ <NL>
,而不是换行符。
如果您执行:%s/\n/\n/
并在十六进制编辑器中保存并打开文件,则所有^@
个字符都是ASCII 0(NUL字符)。为什么Vim开发人员使用左边的\n
代表行尾,而右边的\n
使用NUL超出了我。但是这种特殊行为与Windows与Unix无关。
答案 1 :(得分:22)
查询:
:set fileformat=unix
:set fileformat=dos
这可以在任一平台上用于切换到其他编码。
答案 2 :(得分:6)
在幕后,Vim使用\ r(回车)来保存行结束(无论文件格式如何,只有在读取或写入文件时才有意义)。 Vim使用\ n来表示NUL。但是,您搜索EOL为\ n,但在替换中,\ n代表NUL。它的解释如下:h sub-replace-sepcial。搜索\ r将找到不属于fileformat的EOL的回车符。有很多解释:h文件格式。
答案 3 :(得分:3)
vim对回车符(\ r)和换行符(\ n)进行了一些处理。例如,如果您在Unix中并且vi显示以'^ M'结尾的行,因为它们是Windows文本文件,那么摆脱它们的简单方法是输入命令
:%s/^V^M/^V^M/g
它看起来不应该做任何事情,但确实如此。
答案 4 :(得分:3)
:%s/^V^M/^V^M/g
同样地,以下内容做同样的事情(我认为),并且更容易输入。
:%s/\r/\r/g
答案 5 :(得分:2)
在unix下,在vim中,^V
+ <enter>
为我提供^M
字符\r
。
此外,除非您告诉它以二进制模式编辑文件,即不使用默认自动模式自动检测行结尾,否则您无法在vim中找到\r
。 (它应该在状态中打印[dos]
。)
答案 6 :(得分:2)
我认为问题可能在于Windows和Unix做换行的方式。 Unix的格式是\ n(换行),但对于Windows,它是\ r \ n(回车,换行)。
答案 7 :(得分:0)
在Windows中,如果以文本模式打开文件,\ n将被解释为换行符和换行符。这通常不是* nix系统的情况。