¿Cuál es la mejor manera de hacer dos2unix en un archivo de línea de 500k, en Windows? [cerrado]

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

  •  10-07-2019
  •  | 
  •  

Pregunta

La pregunta lo dice todo, tengo un archivo de 500,000 líneas que se genera como parte de un proceso de compilación automatizado en un cuadro de Windows y está plagado de ^ M . Cuando sale por la puerta necesita ser * nix amigable, ¿cuál es el mejor enfoque aquí, hay algún fragmento de código útil que pueda hacer esto por mí? ¿O necesito escribir una pequeña aplicación C # o Java?

¿Fue útil?

Solución

Aquí hay un Perl one-liner, tomado de http://www.technocage.com / ~ caskey / dos2unix /

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

Puede ejecutarlo de la siguiente manera:

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

O, también puede ejecutarlo de esta manera (la conversión se realiza en el lugar):

perl -pi dos2unix.pl file.dos

Y aquí está mi versión (ingenua) de C:

#include <stdio.h>

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

Debe ejecutarlo con redirección de entrada y salida:

dos2unix.exe < file.dos > file.unix

Otros consejos

Si la instalación de una base cygwin es demasiado pesada, hay una serie de dos2unix y unix2dos Programas independientes de Windows basados ??en consola en la red, muchos con fuente C / C ++ disponible. Si entiendo el requisito correctamente, cualquiera de estas soluciones encajaría perfectamente en un script de compilación automatizado.

Si está en Windows y necesita que algo se ejecute en un script por lotes, puede compilar un simple programa en C para hacer el truco.

#include <stdio.h>

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

        if(c == EOF)
            break;

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

        fputc(c, stdout);
    }

    return 0;
}

Uso:

myprogram.exe < input > output

Editar en el lugar sería un poco más difícil. Además, es posible que desee mantener copias de seguridad de los originales por algún motivo (en caso de que accidentalmente elimine un archivo binario, por ejemplo).

Esa versión elimina todos caracteres CR; si solo desea eliminar los que están en un par CR-LF, puede usar (este es el método clásico de un carácter de regreso :-):

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

Puede editar el archivo en el lugar utilizando el modo " r + " ;. A continuación se muestra un programa general myd2u, que acepta nombres de archivos como argumentos. NOTA: Este programa usa ftruncate para cortar caracteres adicionales al final. Si hay alguna forma mejor (estándar) de hacerlo, edite o comente. Gracias!

#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

Escribirás ^ M como: ctrl + V, Enter

Editar : puede usar '\ r' en lugar de ingresar manualmente un retorno de carro, [ gracias a @strager ]

tr -d '\r' < infile > outfile

Edit 2 : 'tr' es una utilidad de Unix, puede descargar una versión nativa de Windows desde http://unxutils.sourceforge.net [ gracias a @Rob Kennedy ] o use emulación unix de cygwin .

Ftp desde el cuadro dos, al cuadro unix, como un archivo ascii, en lugar de un archivo binario. Ftp eliminará el crlf e insertará un lf . Transfiéralo nuevamente al cuadro de DOS como un archivo binario, y el lf se mantendrá.

Algunos editores de texto, como UltraEdit / UEStudio tienen esta funcionalidad incorporada.

Archivo > Conversiones > DOS a UNIX

Si es solo un archivo, uso notepad ++. Agradable porque es gratis. Tengo instalado Cygwin y uso un script de una línea que escribí para varios archivos. Si te interesa el guión deja un comentario. (No lo tengo disponible en este momento).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top