^ M字符在Vim中是什么意思?


500

^M在vimrc中一直保持性格,这破坏了我的配置。


35
顺便说一句,是一个巨大的资源。
Lightness Races in Orbit

@LightnessRacesinOrbit-嗯,它现在也可以使用表格。我已撤回评论,说链接已死。
ArtOfWarfare 2015年

3
@LightnessRacesinOrbit链接的镜像,该链接目前处于关闭状态:fifi.org/doc/vim/html/digraph.html#digraph-table
alexpls

4
:digraphs在vim中键入将显示@LightnessRacesinOrbit链接到的图表。
askewchan

1
当尝试使用php替换此类字符时,请尝试使用“ preg_replace('/[\x01]/', ' ' ,$str); 希望对您有用”。
雷切尔·盖勒

Answers:


561

Unix使用0xA作为换行符。Windows使用两个字符的组合:0xD 0xA。0xD是回车符。^M恰好是vim显示0xD的方式(0x0D = 13,M是英语字母表中的第13个字母)。

您可以^M通过运行以下命令删除所有字符:

:%s/^M//g

^M被按住进入Ctrl并输入v之后m,然后释放Ctrl。有时缩写为^V^M,但是请注意,您必须按照上一句话中的说明输入它,而不是按字面意思输入。

该表达式将用^M空字符串替换所有出现的(即为空)。我用它来摆脱^M从Windows复制到Unix(Solaris,Linux,OSX)的文件。


9
以防万一,如果您使用的是Windows,则Ctrl + V可能会映射为粘贴。如果是这种情况,则默认值会将“特殊字符转义”键重新映射为Ctrl + Q。
R. Martinho Fernandes

8
真正的问题是,为什么Vim有时会自动检测行尾并正确显示,而有时却不能。
斯科特,

10
^M如果文件的行尾不匹配,您将看到该字符。使用Tomasz提供的命令,然后:fileformat={unix|dos|mac}根据要定位的操作系统进行键入。如果只有几行没有^M字符,则可能需要:fileformat=dos。如果要在vim以外的其他编辑器中编辑文件,请确保已将其配置为匹配行尾(Notepad不会这样做,但是任何知名的编辑器(如Notepad ++或TextMate都可以))。
米克尔·保尔森

9
对于的初学者请注意vi,该命令需要手动输入。只是将其粘贴到vi正在运行的开放式终端中将导致“未找到模式”错误。
IQAndreas 2013年

51
我实际上需要使用@bluesm :%s/\r//g替换文件中的回车符。该^ V ^ M模式不能我有一大堆的^ M字符在文件中找到。
jonnybot

139
:%s/\r//g 

今天为我工作。但是我的情况可能有所不同。


1
g选项不是必需的,每行只有一个新行。 :%s/\r//就足够了。
frogcoder

7
可能非常需要g选项,因为回车不一定是换行符。在Unix模式下打开时,回车符只是另一个字符,而在Windows模式下打开时,回车符仅在特殊情况下紧跟换行符。
乔纳森·鲍德温

65

要翻译新行而不是删除它:

:%s/\r/\r/g

2
这实际上应该做什么?在我看来,它好像是在用“喜欢”代替“喜欢”,我无法想象会改变任何东西。我是否在语法上缺少一些特别之处?
白金天蓝色

16
@PlatinumAzure我不知道为什么没有人想到回答您的问题。\r搜索部分与替换部分的行为不同。例如,请参阅stackoverflow.com/a/3834303

在这里:%s/^V^M/^V^M/g 看到
tomd

@TomD链接指向您正在评论的答案。
bzeaman

对我来说,这用另外的换行符代替了讨厌的字符。@ dlk5730答案对我来说效果更好。即:%s/\r//g
marcusshep

37

这可能意味着您已经收到回车符(不同的操作系统使用不同的方式来通知行尾)。

使用dos2unix固定文件或设置在vim的fileformats:

set ffs=unix,dos

19

假设您的文本文件是-file.txt,然后运行以下命令-

dos2unix file.txt 

它将文本文件从dos转换为unix格式。


完美的作品!
robe007

9

我得到了最初由Mac用户在Windows机器上生成的文本文件,需要使用以下文件将其导入Linux MySQL数据库: load data命令。

尽管VIM显示了'^ M'字符,但以上都不对我的特定问题起作用,但是数据可以导入,但总是以某种方式损坏。最终,解决方案非常简单(经过无奈之后)。

解决方案:在同一文件上执行dos2unix TWICE可以解决问题!使用该file命令可以显示整个过程。

$ file 'file.txt'
file.txt: ASCII text, with CRLF, CR line terminators

$ dos2unix 'file.txt'
dos2unix: converting file file.txt to UNIX format ...
$ file 'file.txt'
file.txt: ASCII text, with CRLF line terminators

$ dos2unix 'file.txt'
dos2unix: converting file file.txt to UNIX format ...
$ file 'file.txt'
file.txt: ASCII text

文件的最终版本完美地导入了数据库。


9

在Unix中,使用'tr'命令可能更容易。

cat file1.txt | tr "\r" "\n" > file2.txt

9

我用sed删除了它们:

sed -i -e 's/\r//g' <filename>

也可以替换为其他字符串或字符:

sed -i -e 's/\r/string/g' <filename>

这些sed命令可以在GNU / Linux版本上运行,sed但可能需要在BSD(包括macOS)上进行调整。




2

如果它破坏了配置,并且映射中需要^ M个字符,则可以简单地将^ M字符替换为<Enter>甚至<C-m>(两个字符都键入为简单字符序列,因此分别为7和5个字符)。

这是在映射中存储特殊键码的唯一建议的便携式方法


2

在FreeBSD中,您可以^M通过键入以下内容手动清除:

:%s/ Ctrl+ V,然后Ctrl+ M,然后再次Ctrl+ M


1

如果您没有fileformat故意指定其他名称(例如,:e ++ff=unix对于Windows文件),则目标文件可能包含混合的EOL。

例如,如果文件的某些行带有<CR><NL>结尾,而另一些带有 <NL>结尾,并且fileformatunix在读取时由Vim自动设置为文件^M (<CR>)。在这种情况下,fileformats发挥作用。有关:help ffs详细信息,请参见。


0

我发现由于我的Homebrew Mvim实例设置为使用filetype = dos,我已经污染了数周。在.vimrc中进行了所需的更改。...


0

尝试:%s/\^M//至少这对我有用。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.