Windows에서 500K 라인 파일에서 dos2Unix를 수행하는 가장 좋은 방법은 무엇입니까? [닫은
-
10-07-2019 - |
문제
질문은 모든 것을 말합니다. Windows 상자에서 자동화 된 빌드 프로세스의 일부로 생성되는 500,000 개의 라인 파일이 있습니다. ^m'에스. 문 밖으로 나가면 필요합니다 *아니야 친절하고, 여기에서 가장 좋은 방법은 무엇입니까, 나를 위해 이것을 할 수있는 편리한 코드 스 니펫이 있습니까? 아니면 작은 C# 또는 Java 앱을 작성해야합니까?
해결책
다음은 Perl One-Liner가 있습니다 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, Enter
편집하다: 캐리지 리턴을 수동으로 입력하는 대신 ' r'을 사용할 수 있습니다.@strager에게 감사합니다]
tr -d '\r' < infile > outfile
편집 2: 'tr'는 Unix 유틸리티이며, 기본 Windows 버전을 http://unxutils.sourceforge.net[@rob Kennedy에게 감사합니다] 또는 사용 CygwinUnix 에뮬레이션.
이진 파일 대신 DOS 상자에서 Unix 상자, ASCII 파일로 FTP. FTP가 제거합니다 CRLF, 삽입 a LF. 이진 파일로 DOS 상자로 다시 전송하십시오. LF 유지됩니다.
다음과 같은 일부 텍스트 편집기 Ultraedit/Uestudio 이 기능이 내장되어 있습니다.
File > Conversions > DOS to UNIX
하나의 파일이라면 메모장 ++를 사용합니다. 무료이기 때문에 좋습니다. Cygwin이 설치되어 있고 여러 파일에 쓴 하나의 라이너 스크립트를 사용합니다. 대본에 관심이 있으면 의견을 남겨주세요. (이 순간에 나에게 그것을 사용할 수 없습니다.)