在Windows的500k行文件上做dos2unix最好的办法是什么?

问题说明了这一切,我有一个500,000行文件,作为Windows盒子上的自动化构build过程的一部分生成,它被^ M所困扰。 当它出门时,它需要* nix友好,这里最好的方法是什么,有一个方便的代码片段可以为我做这个? 还是我需要编写一个C#或Java应用程序?

这是一个Perl单线程,取自http://www.technocage.com/~caskey/dos2unix/

#!/usr/bin/perl -pi s/\r\n/\n/; 

你可以运行它如下:

 perl dos2unix.pl < file.dos > file.unix 

或者,也可以用这种方式运行它(转换是在原地完成的):

 perl -pi dos2unix.pl file.dos 

这是我的(天真的)C版本:

 #include <stdio.h> int main(void) { int c; while( (c = fgetc(stdin)) != EOF ) if(c != '\r') fputc(c, stdout); return 0; } 

您应该使用输入和输出重定向来运行它:

 dos2unix.exe < file.dos > file.unix 

如果安装一个基本的cygwin过于庞大,网络上有许多独立的dos2unixunix2dos Windows独立的基于控制台的程序,许多C / C ++源代码可用。 如果我正确理解了这个需求,那么这些解决方案中的任何一个都可以很好地适用于自动构建脚本。

如果你在Windows上,需要在批处理脚本中运行一些东西,你可以编译一个简单的C程序来实现这个功能。

 #include <stdio.h> int main() { while(1) { int c = fgetc(stdin); if(c == EOF) break; if(c == '\r') continue; fputc(c, stdout); } return 0; } 

用法:

 myprogram.exe < input > output 

编辑会比较困难。 此外,由于某种原因,您可能希望保留原件的备份(例如,如果意外剥离了二进制文件)。

该版本删除所有的 CR字符; 如果你只想删除那些在CR-LF对中的,你可以使用(这是一个经典的单字符返回方法:-):

 /* XXX Contains a bug -- see comments XXX */ #include <stdio.h> int main() { int lastc = EOF; int c; while ((c = fgetc(stdin)) != EOF) { if ((lastc != '\r') || (c != '\n')) { fputc (lastc, stdout); } lastc = c; } fputc (lastc, stdout); return 0; } 

您可以使用模式“r +”就地编辑文件。 下面是一个通用的myd2u程序,它接受文件名作为参数。 注:该程序使用ftruncate在最后删除多余的字符。 如果有更好的(标准)方法来做到这一点,请编辑或评论。 谢谢!

 #include <stdio.h> int main(int argc, char **argv) { FILE *file; if(argc < 2) { fprintf(stderr, "Usage: myd2u <files>\n"); return 1; } file = fopen(argv[1], "rb+"); if(!file) { perror(""); return 2; } long readPos = 0, writePos = 0; int lastC = EOF; while(1) { fseek(file, readPos, SEEK_SET); int c = fgetc(file); readPos = ftell(file); /* For good measure. */ if(c == EOF) break; if(c == '\n' && lastC == '\r') { /* Move back so we override the \r with the \n. */ --writePos; } fseek(file, writePos, SEEK_SET); fputc(c, file); writePos = ftell(file); lastC = c; } ftruncate(fileno(file), writePos); /* Not in C89/C99/ANSI! */ fclose(file); /* 'cus I'm too lazy to make a loop. */ if(argc > 2) main(argc - 1, argv - 1); return 0; } 
 tr -d '^M' < infile > outfile 

您将输入^ M:ctrl + V,回车

编辑 :您可以使用'\ r'而不是手动输入回车,[ 感谢@strager ]

 tr -d '\r' < infile > outfile 

编辑2 :'tr'是一个unix实用工具,你可以从http://unxutils.sourceforge.net [ 感谢@Rob Kennedy ]下载一个本地windows版本,或者使用cygwin的unix仿真。

从dos框到ftp的unix框,ascii文件,而不是一个二进制文件。 Ftp将剥离crlf ,并插入一个lf 。 将其作为二进制文件传回到dos框,并保留lf

一些文本编辑器,例如UltraEdit / UEStudio具有内置的这种功能。

File > Conversions > DOS to UNIX

如果它只是一个文件,我使用记事本++。 很好,因为它是免费的。 我已经安装了cygwin,并使用我为多个文件编写的单线程脚本。 如果您对剧本的兴趣发表评论。 (我现在没有这个机会。)