Windows에서 500K 라인 파일에서 dos2Unix를 수행하는 가장 좋은 방법은 무엇입니까? [닫은

StackOverflow https://stackoverflow.com/questions/313178

  •  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이 설치되어 있고 여러 파일에 쓴 하나의 라이너 스크립트를 사용합니다. 대본에 관심이 있으면 의견을 남겨주세요. (이 순간에 나에게 그것을 사용할 수 없습니다.)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top