什么是“^M”,我该如何摆脱它?

Chr*_*urm 245 vim special-characters

当我在 Vim 中打开文件时,我看到奇怪的^M字符。

不幸的是,世界上最受欢迎的搜索引擎对查询中的特殊字符表现不佳,所以我在这里问:

  • 这是什么^M性格?

  • 怎么可能到了那里?

  • 我该如何摆脱它?

lar*_*sks 169

^M是一个回车符。如果你看到这个,你可能正在看一个起源于 DOS/Windows 世界的文件,其中行尾由回车/换行符对标记,而在 Unix 世界中,行尾由单个换行符标记。

阅读这篇文章了解更多细节,以及换行符的维基百科条目。

本文讨论如何设置 vim 以透明地编辑具有不同行尾标记的文件。

如果^M在某些行的末尾有一个文件,并且您想删除它们,请在 Vim 中使用它:

:s/^M$//
Run Code Online (Sandbox Code Playgroud)

(按Ctrl+ V Ctrl+M以插入^M。)

  • 尝试使用 `:%s/^M/\r/g` 来移除 `^M` 并将 `^M` 替换为换行符 `\r`。如果没有“%”,该命令仅适用于当前行。我遇到了一些例子,其中 `^M` 不在行尾,例如 `The first line.^MThe second line.` (18认同)
  • 或者,如果您不想要大量换行符,您可以执行 `:%s/^M/` (3认同)
  • 不确定它是否在我的 vim 配置中,但我必须输入 `Ctrl+Q`,然后输入 `Ctrl+M` 才能生成该字符! (3认同)
  • 如果它本身只是一个回车,那可能是经典的(Unix 之前的)Macintosh 换行符。甚至一些较新的程序(如 Excel 2007 for Mac)出于某种原因也会这样做。 (2认同)

小智 77

一种更简单的方法是使用以下命令:

dos2unix filename
Run Code Online (Sandbox Code Playgroud)

此命令也适用于路径模式,例如

dos2unix path/name*
Run Code Online (Sandbox Code Playgroud)

如果它不起作用,请尝试使用不同的模式:

dos2unix -c mac filename
Run Code Online (Sandbox Code Playgroud)
  • -c设置转换模式。凡CONVMODE是一个:ascii, 7bit, iso, macascii是默认值。

  • +1 用于提及 -c 标志默认值和其他选项。第一次尝试,默认没有预期的结果。使用 `dos2unix -c max` 就可以了。`dos2unix:将文件 launch_me.sh 转换为 Unix 格式...` (2认同)

Str*_*ker 67

这对我有用

:e ++ff=dos 
Run Code Online (Sandbox Code Playgroud)

:e ++ff=dos 命令告诉 Vim 再次读取文件,强制使用 dos 文件格式。Vim 将删除 CRLF 和 LF-only 行尾,只在缓冲区中留下每一行的文本。

然后

:set ff=unix 
Run Code Online (Sandbox Code Playgroud)

最后

:wq 
Run Code Online (Sandbox Code Playgroud)

  • 谢谢!这对我有用,但公认的解决方案没有 (9认同)

Aar*_*own 47

大多数 UNIX 操作系统都有一个实用程序dos2unix,可以将 CRLF 转换为 LF。其他答案涵盖了“它们是什么”的问题。


Joh*_*han 11

摆脱回车的另一种方法是使用tr命令。

我有一个看起来像这样的小脚本

#!/bin/sh
tmpfile=$(mktemp)
tr -d '\r' <"$1" >"$tmpfile"
mv "$tmpfile" "$1"
Run Code Online (Sandbox Code Playgroud)


Dal*_*und 9

您可以使用以下方法清理它sed

sed -e 's/^M$//' < infile > outfile
Run Code Online (Sandbox Code Playgroud)

诀窍是如何正确输入回车符。通常,您需要键入C-v C-m以输入文字回车符。您还可以使用 sed 进行工作

sed -i.bak -e 's/^M$//' infile
Run Code Online (Sandbox Code Playgroud)


Dre*_*her 9

sed 就地解决方案,无需键入特殊字符(您可以复制它并且它可以工作):

sed -i -e "s/\r//g" filename
Run Code Online (Sandbox Code Playgroud)

解释:

-i: in-place
-e: regular expression
\r: escaped carriage return
/g: replace globally
Run Code Online (Sandbox Code Playgroud)

  • 这帮助我从 Windows 桌面编辑 Alpine Linux 上的文件,该文件会将 Ctrl M 视为行返回,使上述答案无效。 (2认同)

Pra*_*nse 5

这是什么^M?
^M 是回车符。如果你看到这个,你可能正在看一个起源于 DOS/Windows 世界的文件,其中行尾由回车/换行符对标记,而在 Unix 世界中,行尾由单个换行符标记。

怎么可能到了那里?
当文件格式发生变化时。

我该如何摆脱它?
打开你的文件

vim -b FILE_PATH
Run Code Online (Sandbox Code Playgroud)

使用以下命令保存

:%s/^M//g
Run Code Online (Sandbox Code Playgroud)

  • 此答案不会为其他答案添加任何内容。第一段几乎是已接受答案的逐字副本。给定的代码不会_save_任何东西,而只会_remove_所有行中的所有回车字符。而且我不确定以二进制模式打开文件在这里会有什么帮助。 (5认同)