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

这个^M字符是什么?
它怎么会到达那里?
我如何摆脱它?


评论

这是一个控制字符图,有关更多信息:help digraph-table。

VS Code的底部有一个EOL选项,它将自动转换打开的文件。

使用VSCode时使用@StackUnderflow,在处理Linux文件时将行尾更改为LF很有帮助。我使用WSL ... Windows文件(例如$ profile)的Linux文件以LF结尾没有问题。也许Win在这里击败了Linux。

#1 楼

^M是回车符。如果看到这种情况,则可能是在查看源自DOS / Windows世界的文件,其中的行尾由回车/换行符对标记,而在Unix世界中,则是行尾由一个换行符标记。带有不同的行结束标记。 />
:s/^M$//


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

评论


尝试:%s / ^ M / \ r / g代替^ M并将^ M替换为换行符\ r。如果没有%,该命令仅适用于当前行。我遇到了一些示例,其中^ M不在行尾,例如第一行。^ M第二行。

–乔治
2015年4月14日4:29



或者,如果您不希望出现大量的换行符,则可以执行:%s / ^ M /

–carefulnow1
16年11月21日在8:52

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

– sudo
17-4-18在17:22



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

– vivex
18-2-16在7:23



不知道它是否在我的vim配置中,但是我必须输入Ctrl + Q,然后按Ctrl + M才能生成该字符!

–布拉德公园
20年1月14日在19:59

#2 楼

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

dos2unix filename


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

dos2unix path/name*


如果不起作用,请尝试使用其他模式:其中CONVMODE为以下之一:-c,其中ascii, 7bit, iso, mac为默认值。


评论


+1表示-c标志的默认值和其他选项。初次尝试时,默认设置没有预期的结果。使用dos2unix -c max可以正常工作。 dos2unix:将文件launch_me.sh转换为Unix格式...

–Johnny C
19/12/19在16:43



惊人的小实用程序。对于ubuntu,只需apt-get install dos2unix。如果您需要递归使用它,可以在这里参考以下解决方案:stackoverflow.com/questions/11929461/…我很愚蠢地在每个目录上手动运行它,并且只想查找事实。

–anon58192932
20年7月22日在5:36

#3 楼

这对我有用。 Vim会删除CRLF和仅LF的行尾,仅将每行的文本保留在缓冲区中。

:e ++ff=dos 


评论


谢谢!这对我有用,但可接受的解决方案没有

– 3pitt
18年5月30日在18:03

ff是指文件格式吗?那++ ff呢?

– KcFnMi
18年8月23日在18:10

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

–Stryker
18年8月29日在20:05

要了解ff,请执行“:help ff”

– sqqqrly
20年1月22日在15:03

简单有效。我不确定为什么当文件1首先没有cat 1时>> file2引入dos换行

–算盘阅读器
20-4-23在12:09

#4 楼

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

#5 楼

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

我有一个小脚本,如下所示

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


#6 楼

您可以使用sed清理它:

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


诀窍是如何正确进入回车位。通常,您需要输入C-v C-m来输入文字回车。您也可以使用

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

来完成sed工作。

#7 楼

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

sed -i -e "s/\r//g" filename


解释:

评论


注意,发问者已经在使用VIM编辑文件。自2012年以来,这里一直有sed答案。

– JdeBP
20 Mar 13 '20 at 10:50

是的,但是缺少一个有效的可行解决方案。现有的sed解决方案不能立即使用。

–DreamFlasher
20 Mar 14 '11:11

Dale Hagglund的就地sed无疑是开箱即用的。

– JdeBP
20 Mar 16 '20 at 10:09



好吧,不适合我。我正在使用Ubuntu LTS 18.04。

–DreamFlasher
20 Mar 16 '20在11:42

这帮助我从Windows桌面上的Alpine Linux上编辑了一个文件,该文件会将Ctrl M视为行返回,使上述答案无效。

– Zacran
20年8月13日在23:26

#8 楼

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

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

vim -b FILE_PATH
打开文件

用以下命令保存文件

:%s/^M//g


评论


您打开文件时遇到错字。

– Mateusz Piotrowski
16年1月27日在20:48

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

–杜布
16年1月28日在7:58



#9 楼

就我而言,

以上都不起作用,我将一个CSV文件从我的mac复制到Linux机器,并且使用了上面所有命令,但下面一个命令无济于事

tr "5" "\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,


评论


mac2unix -n输入文件输出文件,或者等效地,dos2unix -c mac -n输入文件输出文件将处理这种情况。

–罗宾·米德(Robin A. Meade)
19/12/11在1:48

#10 楼

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

 ex -bsc '%s/\r//|x' file
 



-b二进制模式
%选择所有行
s替换
\r回车
x保存并关闭


#11 楼

将以下行添加到〜/ .vimrc

command! Tounix :call Preserve('1,$s/^M//')


然后,当您拥有Windows行尾的文件时,运行命令“:Tounix”。

#12 楼

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

dos2unix file可以提供帮助

评论


这个答案不会带来新的东西,dos2unix至少在两个更古老的答案中已经提到过。

– Rui F Ribeiro
19年4月12日在14:06