windows - ejemplo - dos2unix ubuntu
¿Cuál es la mejor manera de hacer dos2unix en un archivo de línea de 500k en Windows? (7)
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á lleno de ^ M. Cuando sale por la puerta necesita * nix friendly, ¿cuál es el mejor enfoque aquí, hay algún fragmento de código que pueda hacer esto por mí? ¿O debo escribir una pequeña aplicación C # o Java?
Algunos editores de texto, como UltraEdit / UEStudio tienen esta funcionalidad incorporada.
File > Conversions > DOS to UNIX
Aquí hay un trazador de líneas Perl, 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 bien, puede ejecutarlo también de esta manera (la conversión se realiza en el lugar):
perl -pi dos2unix.pl file.dos
Y aquí está mi (ingenua) versión 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 la redirección de entrada y salida:
dos2unix.exe < file.dos > file.unix
Ftp desde el cuadro dos, al cuadro Unix, como un archivo ASCII, en lugar de un archivo binario. Ftp quitará el crlf e insertará un lf . Transfiérelo de nuevo a la caja de dos como un archivo binario, y se mantendrá el lf .
Si es solo un archivo, uso notepad ++. Agradable porque es gratis. Tengo cygwin instalado y uso un script de un trazador que escribí para múltiples archivos. Si su interés en el guión deja un comentario. (No lo tengo disponible para mí en este momento).
Si la instalación de una base cygwin es demasiado pesada, hay una serie de programas basados en la consola independientes de dos2unix
y unix2dos
Windows en la red, muchos de ellos con fuente C / C ++ disponible. Si estoy entendiendo el requisito correctamente, cualquiera de estas soluciones encajaría muy bien en una secuencia de comandos de construcción automatizada.
tr -d ''^M'' < infile > outfile
Tecleará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
Edición 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 usar la emulación de unix de cygwin .
Si está en Windows y necesita ejecutar algo 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
La edición en el lugar sería un poco más difícil. Además, es posible que desee guardar copias de seguridad de los originales por alguna razón (en caso de que accidentalmente quite un archivo binario, por ejemplo).
Esa versión elimina todos los 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 solo carácter :-):
/* 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 in situ usando el modo "r +". A continuación se muestra un programa myd2u general, que acepta nombres de archivos como argumentos. NOTA: Este programa utiliza 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;
}