Frage

Frage sagt alles, ich habe eine 500.000 Zeilendatei bekommt, die auf einer Windows-Box als Teil eines automatisierten Build-Prozesses erzeugt werden, und es ist gespickt mit ^ M 's. Wenn es die Tür geht es muss * nichts freundlich, was ist der beste Ansatz, hier gibt es einen handlichen Code-Schnipsel, die dies für mich tun könnten? Oder muss ich ein wenig C # oder Java-Anwendung schreiben?

War es hilfreich?

Lösung

Hier ist ein Perl-Einzeiler, genommen von http://www.technocage.com / ~ Caskey / dos2unix /

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

Sie können es laufen wie folgt:

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

Sie können aber auch auf diese Weise ausgeführt werden (die Umsetzung in-place getan):

perl -pi dos2unix.pl file.dos

Und hier ist meine (naive) C-Version:

#include <stdio.h>

int main(void)
{
   int c;
   while( (c = fgetc(stdin)) != EOF )
      if(c != '\r')
         fputc(c, stdout);
   return 0;
}

Sie sollten es mit Ein- und Ausgabeumleitung ausführen:

dos2unix.exe < file.dos > file.unix

Andere Tipps

Wenn eine Basis Installation Cygwin zu schwer ist, gibt es eine Reihe von eigenständigen dos2unix und unix2dos eigenständigen Windows-Konsole -basierte Programme im Netz, viele davon mit C / C ++ Quelle zur Verfügung. Wenn ich die Anforderung richtig bin Verständnis, eine dieser beiden Lösungen würde gut in einen automatisierten Build-Skript passen.

Wenn Sie unter Windows sind und etwas brauchen in einer Batch-Skript ausführen, können Sie ein einfaches C-Programm kompilieren, den Trick zu tun.

#include <stdio.h>

int main() {
    while(1) {
        int c = fgetc(stdin);

        if(c == EOF)
            break;

        if(c == '\r')
            continue;

        fputc(c, stdout);
    }

    return 0;
}

Verbrauch:

myprogram.exe < input > output

Bearbeiten an Ort und Stelle wäre ein bisschen schwieriger. Außerdem aus irgendeinem Grund können Sie Backups der Originale halten (falls Sie versehentlich eine Binärdatei Streifen, zum Beispiel).

Diese Version entfernt alle CR-Zeichen; wenn Sie nur die, die entfernt werden sollen, die in einem CR-LF Paaren sind, können Sie verwenden (dies ist die klassische Ein-Zeichen-back-Methode: -):

/* 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;
}

Sie können die Datei an Ort und Stelle unter Verwendung von Modus „r +“ bearbeiten. Im Folgenden finden Sie ein allgemeines myd2u Programm, das Dateiname als Argument akzeptiert. Hinweis: Dieses Programm verwendet ftruncate am Ende zusätzliche Zeichen abzuzuhacken. Wenn es eine bessere (Standard) Art und Weise, dies zu tun, bearbeiten Sie oder kommentieren. Dank!

#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

Sie geben ^ M als: Strg + V, Enter

Bearbeiten : Sie können '\ r' anstelle von manuell einen Wagenrücklauf eingeben, [ dank @strager ]

tr -d '\r' < infile > outfile

Edit 2 : 'tr' ist ein Unix-Dienstprogramm können Sie eine native Windows-Version von herunterladen http://unxutils.sourceforge.net [ dank @ Rob Kennedy ] oder verwenden Sie cygwin 's Unix-Emulation.

FTP- es von der DOS-Box, auf den Unix-Rechner, als ASCII-Datei anstelle einer Binärdatei. Ftp die Streifen crlf , und fügen Sie ein lf . Bringen Sie es zurück in die DOS-Box als Binärdatei, und die lf wird beibehalten.

Einige Texteditoren, wie UltraEdit / UEStudio diese Funktionalität eingebaut.

File > Conversions > DOS to UNIX

Wenn es nur eine Datei, die ich Notepad ++ verwenden. Schön, denn es ist kostenlos. Ich habe Cygwin einen Einzeiler Skript installiert und verwende ich für mehrere Dateien geschrieben. Wenn Ihr Interesse an dem Skript einen Kommentar abzugeben. (Ich habe es mir nicht verfügbar einer diesen Moment.)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top