问题说明了这一切,我有一个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过于庞大,网络上有许多独立的dos2unix
和unix2dos
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,并使用我为多个文件编写的单线程脚本。 如果您对剧本的兴趣发表评论。 (我现在没有这个机会。)