`^ M`在源代码文件的许多行中。我该如何删除它们?


1

最近有人给我发了几个.cpp源代码文件。在用GNU Emacs或GVIM打开文件时,我发现它们在^M每一行的末尾附近有一个奇怪的字符。

这是一个显示我的意思的屏幕截图编辑截图

当我用Gedit打开这些相同的源文件时,我看不到这些^M字符。我该怎么办?这里有许多文件存在问题,因此通过替换空字符串来打开和执行搜索替换操作看起来像是一个反向操作。

奇怪的是,当我用GCC编译时,这些文件编译得很干净。这里发生了什么。我该怎么办?


如果你将继续与这个人合作,你几乎肯定什么也不做。它们不会造成任何伤害,如果您发送任何已修改的文件,那么当他尝试使用该文件时,您可能会给他带来问题。
Zoredache

Answers:


6

在Unix中,新行字符是\n,而在Windows中则是\r\n\r或者^M是回车符。

如果文件是在Windows模式下的编辑器中写入的,则每个新行字符都将包含回车符。如果你告诉你的编辑(如果它理解的话)在windows中处理新的行字符,你就不会再看到这些^M字符了。

或者,您可以dos2unix在代码库上运行以解决此问题。

正如你正确观察到的那样,你不会在编译中看到任何问题,因为这不是代码中的任何特殊字符,而只是在windows和linux中的换行符解释之间不匹配。


更多方法:sed.sourceforge.net/sed1line.txt下将文件从DOS转换为UNIX,反之亦然
lupincho

1

您有一个包含混合Windows和UNIX行结尾的源文件。虽然UNIX只使用了换行符(有时显示为^ J),但Windows使用了回车+换行符(有时显示为^ M ^ J)。您的编辑器会看到UNIX行并说“这必须是一个UNIX文件”,然后看到分散的Windows行结尾并说“这是一个特殊字符,我必须显示它”。

您可以尝试以某种方式转换文件。您可以尝试使用该命令dos2unix转换为UNIX行结尾。这将适用于UNIX端,但除非你得到一个知道UNIX结尾的Windows编辑器,否则你的Windows端将会混乱。

或者您可以使用unix2dos并制作所有Windows。如果您与整个文件保持一致,那么您的UNIX编辑器(通常比Windows编辑知道UNIX结尾更容易知道Windows结尾)应该没问题。这个特定的时间emacs / gvim只是因为文件不一致而感到困惑。

如您所见,编译器不关心行结尾是什么。


1

源洞察 - >选项 - >首选项 - >“文件”选项卡 - >在默认文件格式菜单中创建“Unix(LF)”。



0

你在emacs / vim中看到这些的原因是它们如何读取事物/如何编码。该^M实际上只是一个Carriage Return(点击回车键)。

无论如何,你可以尝试(在vim中,因为我不知道Emacs中的相应命令):set ff=unix,然后:w,它应该把它变成Unix格式并在下次打开它时去掉它(iirc)。

或者,如果^M要从文档中明确删除,请执行搜索/替换(在Vim中,因为我只知道):%s/<ctrl + v><ctrl + m>//gc

此链接显示有关如何在Emacs中为返回执行S / R的命令。)

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.