Vim 中的 ^M 字符是啥意思?

Posted

技术标签:

【中文标题】Vim 中的 ^M 字符是啥意思?【英文标题】:What does ^M character mean in Vim?Vim 中的 ^M 字符是什么意思? 【发布时间】:2011-08-16 03:43:52 【问题描述】:

我的 vimrc 中不断出现^M 字符,它破坏了我的配置。

【问题讨论】:

顺便说一句 this 是一个很好的资源。 @LightnessRacesinOrbit - 嗯,它现在也可以使用表单。我已撤回我的评论,说链接已失效。 @LightnessRacesinOrbit 链接的镜像,目前已关闭:fifi.org/doc/vim/html/digraph.html#digraph-table 在 vim 中键入 :digraphs 会显示 @LightnessRacesinOrbit 链接到的有向图。 当尝试使用php替换这种字符时,试试这个preg_replace('/[\x01]/', ' ' ,$str); 希望它有帮助。 【参考方案1】:

这可能意味着你有回车(不同的操作系统使用不同的方式来表示行尾)。

使用dos2unix 修复文件或在vim中设置文件格式:

set ffs=unix,dos

【讨论】:

【参考方案2】:

您可以在 vim 中使用

解决此问题
:1,$s/^V^M//g

其中 ^ 是控制字符。

【讨论】:

这并不能解释^M是什么。 他并不是真的在问它是什么,而是在问如何解决它。它是一个来自 DOS 的回车符。 知道它是什么。问题的标题是“Vim 中的 ^M 字符是什么意思”。【参考方案3】:

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

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

:%s/^M//g

^M 的输入方法是按住 Ctrl 并键入 v,然后键入 m,然后松开 Ctrl kbd>。这有时缩写为^V^M,但请注意,您必须按照上句所述输入它,而不是按字面输入。

这个表达式会将所有出现的^M 替换为空字符串(即什么都没有)。我用它来删除从 Windows 复制到 Unix(Solaris、Linux、OSX)的文件中的^M

【讨论】:

以防万一您在 Windows 上,Ctrl+V 可能会被映射为粘贴。如果是这种情况,默认值会将“特殊字符转义”键重新映射为 Ctrl+Q。 真正的问题是为什么 Vim 有时会自动检测行尾并正确显示,而有时却不能。 如果文件的行尾不匹配,您将看到 ^M 字符。使用 Tomasz 提供的命令,然后根据您的目标操作系统键入 :fileformat=unix|dos|mac。如果只有几行没有^M 字符,您可能需要:fileformat=dos。如果您在 vim 以外的编辑器中编辑文件,请确保将其配置为匹配行尾(记事本不会这样做,但任何有信誉的编辑器如 Notepad++ 或 TextMate 都会这样做)。 初学者注意vi,该命令需要手动输入。只需将其粘贴到运行 vi 的打开终端中就会导致“找不到模式”错误。 @bluesm 我实际上需要使用:%s/\r//g 来替换文件中的回车符。在我有一堆 ^M 字符的文件中找不到 ^V^M 模式。【参考方案4】:

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

这是在映射中存储特殊键码的唯一推荐的、可移植的方式

【讨论】:

【参考方案5】:
:%s/\r//g 

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

【讨论】:

g 选项不是必需的,每行只有一个新行。 :%s/\r// 就足够了。 很可能需要 g 选项,因为回车不一定是换行符。在 Unix 模式下打开时,回车只是另一个字符,而在 Windows 模式下打开时,回车只是特殊的紧跟换行符。【参考方案6】:

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

:%s/ Ctrl+V,然后是Ctrl+M,然后是Ctrl kbd>+M 再次。

【讨论】:

【参考方案7】:

翻译新行而不是删除它:

:%s/\r/\r/g

【讨论】:

这实际上应该做什么?对我来说,它看起来像是在用like代替like,我无法想象这会改变什么。我是否遗漏了一些关于语法如何在这里工作的特别之处? @PlatinumAzure 我不知道为什么没有人想过回答你的问题。 \r 在搜索部分与替换部分有不同的行为。例如,请参阅***.com/a/3834303。 :%s/^V^M/^V^M/g 见here @TomD 该链接指向您正在评论的答案。 对我来说,这用一个额外的换行符替换了烦人的字符。 @dlk5730 答案对我来说效果更好。即:%s/\r//g【参考方案8】:

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

虽然 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】:

我用 sed 删除了它们:

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

也可以用不同的字符串或字符替换。例如,如果没有换行符,您可以将\r 转换为\n

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

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

【讨论】:

【参考方案10】:

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

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

【讨论】:

【参考方案11】:

假设你的文本文件是-file.txt,然后运行这个命令-

dos2unix file.txt 

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

【讨论】:

完美运行!【参考方案12】:

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

【讨论】:

【参考方案13】:

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

【讨论】:

【参考方案14】:

如果您没有有意指定不同的 fileformat(例如,Windows 文件为 :e ++ff=unix),则目标文件可能混合了 EOL。

例如,如果文件的某些行以<CR><NL> 结尾,而其他行以 <NL> 结尾,而fileformat 被 Vim 自动设置为 unix 时,^M (<CR>) 会出现。 在这种情况下,fileformats(注意:还有一个额外的s)会发挥作用。详情请见:help ffs

【讨论】:

【参考方案15】:

这是唯一对我有用的方法:

:e ++ff=dos

:wq

【讨论】:

太棒了!这为需要它们的人保留了 DOS 行尾,并修复了阻止 Vim 正确识别 DOS 行尾的错误(我有一个文件在数千行中缺少一个 CR)。

以上是关于Vim 中的 ^M 字符是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章

Python ABI 标签中的“m”是啥意思?

KMP是啥意思

SSE 指令中的 UnsignedSaturate 是啥意思?

url 查询中的字符 %7D 是啥意思?

vim <plug> 是啥意思

当我创建一个新项目时,Xcode 4 的 Project Navigator 中的“M”和“A”图标是啥意思?