问题说明了一切,我有一个500,000行文件,它是在Windows机器上自动构建过程的一部分生成的,并且充满了 ^ M 。当它出门时需要 * nix 友好,这里最好的方法是什么,是否有一个方便的代码片段可以为我做到这一点?或者我是否需要编写一些C#或Java应用程序?
答案 0 :(得分:10)
这是一个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
答案 1 :(得分:6)
如果安装基础cygwin太重,网上有许多独立的dos2unix
和unix2dos
Windows独立的基于控制台的程序,其中许多都有C / C ++源代码可用。如果我正确理解了这个要求,这些解决方案中的任何一个都可以很好地适应自动构建脚本。
答案 2 :(得分:5)
如果你在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;
}
答案 3 :(得分:4)
tr -d '^M' < infile > outfile
您将键入^ M as:ctrl + V,Enter
编辑:您可以使用'\ r'代替手动输入回车,[感谢@strager ]
tr -d '\r' < infile > outfile
编辑2 :'tr'是一个unix实用程序,您可以从http://unxutils.sourceforge.net下载本机Windows版本[感谢@Rob Kennedy ]或使用cygwin的unix仿真。
答案 4 :(得分:1)
将它从dos框转到unix框,作为ascii文件,而不是二进制文件。 Ftp将剥离 crlf ,并插入 lf 。将其作为二进制文件传回dos框, lf 将被保留。
答案 5 :(得分:1)
某些文本编辑器(例如UltraEdit/UEStudio)内置了此功能。
File > Conversions > DOS to UNIX
答案 6 :(得分:-2)
如果它只是一个文件,我使用notepad ++。很好,因为它是免费的。我安装了cygwin并使用我为多个文件编写的单行脚本。如果您对脚本的兴趣发表评论。 (这一刻我没有这个。)