什么是`^ M`,我如何摆脱它?


134

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

不幸的是,世界上最受欢迎的搜索引擎在查询中使用特殊字符的效果不佳,因此我在这里问:

  • 这个^M角色是什么?

  • 它怎么可能到达那里?

  • 我如何摆脱它?


3
Vlastimil毫无意义。得到是英式英语的正确过去时态。
Jesse_b

1
这是一个控制字符图,有关更多信息: help digraph-table
埃里克·莱斯钦斯基

Answers:


107

^M是一个回车符。如果看到此消息,则可能是在查看源自DOS / Windows世界的文件,该文件的行尾由回车/换行符对标记,而在Unix世界中,该行的末尾由回车/换行对标记。用一个换行符标记。

阅读本文以获得更多详细信息,也请阅读Wikipedia条目的换行符

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

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

:s/^M$//

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


11
尝试:%s/^M/\r/g删除^M并替换^M为换行符\r。不使用时%,该命令仅适用于当前行。我遇到了一些^M不在行尾的示例,例如The first line.^MThe second line.
George

或者,如果您不希望出现大量的换行符,那么您可以做:%s/^M/
now16年1

2
如果它本身只是一个回车符,那可能是经典的(Unix之前)Macintosh换行符。甚至由于某些原因,诸如Mac的Excel 2007之类的一些较新程序也会这样做。
sudo

@larsks但是altap.cz/salamander/help/salamand/appendix_txtfiles表示^M在UNIX中使用
Vivek

您链接到的文章说它\n在Unix中使用,这是正确的。那是ASCII码10,否则称为^J
larsks

39

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


36

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

dos2unix filename

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

dos2unix path/name*

如果不起作用,请尝试使用其他模式:

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

22

这对我有用

:e ++ff=dos 

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

然后

:set ff=unix 

最后

:wq 

3
谢谢!这对我
有用,

是否ff指的是文件格式?那++ff
KcFnMi

:e ++ ff = dos命令告诉Vim再次读取文件,强制使用dos文件格式。Vim将删除CRLF和仅LF的行尾,仅在缓冲区中保留每行的文本。
斯特赖克

10

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

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

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

6

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

sed -e 's/^M$//' < infile > outfile

诀窍是如何正确输入回车符。通常,您需要键入C-v C-m以输入文字回车符。您还可以通过以下方式完成sed工作:

sed -i.bak -e 's/^M$//' infile

2

这是什么^ M?
^ M是回车符。如果看到此消息,则可能是在查看源自DOS / Windows世界的文件,该文件的行尾由回车/换行符对标记,而在Unix世界中,该行的末尾由回车/换行对标记。用一个换行符标记。

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

我如何摆脱它?
使用打开文件

vim -b FILE_PATH

用以下命令保存

:%s/^M//g

您使用打开文件时遇到错字。
Mateusz Piotrowski

4
该答案不添加任何其他答案。第一段是已接受答案的几乎逐字记录的副本。给定的代码将不会保存任何内容,而只会删除所有行中的所有回车符。而且我不确定以二进制模式打开文件在这里是否有帮助。
迪布

2

就我而言

上面没有任何工作,我从Mac复制了一个CSV文件到Linux机器,并且使用了上面所有命令,但下面没有任何帮助

tr "\015" "\n" < inputfile > outputfile

我有一个文件,其中^ M个字符在以下各行之间被抽动

Audi,A4,35 TFSi Premium,,CAAUA4TP^MB01BNKT6TG,TRO_WBFB_500,Trico,CARS,Audi,A4,35 TFSi Premium,,CAAUA4TP^MB01BNKTG0A,TRO_WB_T500,Trico,

0

您可以在Ex模式下使用Vim:

ex -bsc '%s/\r//|x' file
  1. -b 二进制模式

  2. % 选择所有行

  3. s 替代

  4. \r 回车

  5. x 保存并关闭



-1

过去,我什至看不到配置文件也无法正确解析并抱怨空格,但是如果您使用vi并执行设置列表,它将不会显示空格,grep filename [[space]]会显示^ M

那是时候dos2unix file帮助


这个答案不会带来新的东西,dos2unix至少在两个更老的答案中已经提到过。
Rui F Ribeiro
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.