dos2unix无法转换^M

18

我从运行在Windows 7上的程序中将结果导出到一个文本文件,并将该文件复制到Xubuntu 14.04上。在终端中,我运行了dos2unix file.txt, 它告诉我转换文件out_mapqtl.txt为Unix格式。然而,当我使用less查看文件时,仍然可以看到Windows换行符^M,并且wc -l为“0”。

我尝试了一些描述这里的方法,但是没有一个方法可行。然后我在Vim中打开文件并执行了:%s/\r/\r/g,就像那里所解释的那样,这很好用。那么,为什么dos2unix不起作用呢?有没有办法避免每次都打开Vim?


1
有点晚了...但我写了一个小程序,当你不确定输入格式或输入格式交织在一起时,它比dos2unix更容易使用:https://github.com/mdolidon/endlines - Mathias Dolidon
@MathiasDolidon 谢谢你,Mathias! - isomorphismes
你的问题可以重新表述为: 为什么dos2unix不会修改文本文件? * 这里有一个相反的问题: 为什么dos2unix会修改二进制文件? * 两个问题的简单答案是: 因为dos2unix并不是万无一失的。 - Henke
4个回答

20

我知道您已经解决了这个问题,但我想添加一个参考注释,基于我所做的一些测试。

如果 less 显示 ^M,则像 Sybren 一样,我怀疑它是 MAC 风格的结尾符(\r),而不是 DOS 风格的结尾符(\r\n)。 您可以使用 cat 轻松确定:

$ cat -e 文件名

  • Unix 结尾符(\n)显示为 $
  • MAC 结尾符(\r)显示为 ^M(less 显示这些)
  • DOS/Windows 结尾符(\r\n)显示为 ^M$(less 看不到这些)

使用 dos2unix 去除 DOS (^M$) 结尾符

使用 mac2unix 去除 MAC (^M) 结尾符 - dos2unix 无法去除这些。

我有一个文件,我必须使用 dos2unix 和 mac2unix 来去除所有非 Unix 结尾符。


谢谢你的回答,我在运行dos2unix时遇到了困难,没意识到文件以某种方式使用了旧的Mac换行符。 - Pellet

15

\r代表回车符,而在Mac上它不需要\n作为换行符。你确定文件是DOS (\r\n)格式而不是Mac (\r)格式吗?

如果VIM真的是唯一可以修复你的文件的工具,你也可以这样调用它:

vim somefile.txt +"%s/\r/\r/g" +wq

这将打开文件,执行操作,保存并退出。

您能给我们提供一个文件示例以便我们进一步调查吗?


抱歉回答晚了。该文件是在Windows 7上生成的,因此我认为它是DOS格式的。我甚至不确定该程序是否能在Mac上运行。顺便说一下,这个程序叫做MapQTL。无论如何,我的问题现在已经解决了,谢谢。 - tflutre
感谢您告诉我们您的问题已经解决,并接受我的解决方案作为答案。 - dr. Sybren
你好,"%s/\r/\r/g" 是什么意思?它看起来像是 sed 表达式。将 '\r' 替换为 "\r" 吗? - nathan
1
是的,这就是它的作用。前面的“%”将表达式应用于文件中的所有行。由于 VIM 的行结尾处理魔法,这个看似无用的表达式实际上会发挥作用。 - dr. Sybren

1

试试这个:

tr -d '\r' < file

0

我使用了Notepad++的功能:

编辑>EOL转换>Unix(LF)。

现在使用pscp.exe将此文件导出到Unix机器。

如果这对你有用,请告诉我。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接