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 字符是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章