Qual é a melhor maneira de fazer o DOS2UNIX em um arquivo de 500k Line, no Windows? [fechado

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

  •  10-07-2019
  •  | 
  •  

Pergunta

Pergunta diz tudo, eu tenho um arquivo de 500.000 linhas que é gerado como parte de um processo de construção automatizado em uma caixa do Windows e está cheia de ^M's. Quando sai pela porta, precisa *nix Amigável, qual é a melhor abordagem aqui, há um trecho prático de código que poderia fazer isso por mim? Ou preciso escrever um pequeno aplicativo C# ou Java?

Foi útil?

Solução

Aqui está uma linha perl, tirada de http://www.technocage.com/~caskey/dos2unix/

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

Você pode executá -lo da seguinte maneira:

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

Ou você pode executá-lo também dessa maneira (a conversão é feita no local):

perl -pi dos2unix.pl file.dos

E aqui está minha versão (ingênua) C:

#include <stdio.h>

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

Você deve executá -lo com redirecionamento de entrada e saída:

dos2unix.exe < file.dos > file.unix

Outras dicas

Se instalar uma base Cygwin é muito pesado, há vários dos2unix e unix2dos Programas baseados em console independentes do Windows na rede, muitos com fonte C/C ++ disponíveis. Se eu estiver entendendo o requisito corretamente, qualquer uma dessas soluções se encaixaria bem em um script de compilação automatizada.

Se você estiver no Windows e precisar de algo executado em um script em lote, poderá compilar um programa C simples para fazer o truque.

#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

A edição no local seria um pouco mais difícil. Além disso, convém manter backups dos originais por algum motivo (caso você acidentalmente retire um arquivo binário, por exemplo).

Essa versão remove tudo Personagens de CR; Se você deseja remover apenas aqueles que estão em um par CR-LF, você pode usar (este é o método clássico de um caractere de costas :-):

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

Você pode editar o arquivo no local usando o modo "R+". Abaixo está um programa Geral MyD2U, que aceita nomes de arquivos como argumentos. Nota: Este programa usa o Ftruncato para cortar caracteres extras no final. Se houver alguma maneira melhor (padrão) de fazer isso, edite ou comente. Obrigado!

#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

Você digitará ^m como: ctrl+v, digite

Editar: Você pode usar ' r' em vez de entrar manualmente em um retorno de carruagem, [Obrigado a @Stager]

tr -d '\r' < infile > outfile

Editar 2: 'TR' é um utilitário Unix, você pode baixar uma versão nativa do Windows de http://unxutils.sourceforge.net[Obrigado a @rob Kennedy] ou uso CygwinEmulação do Unix.

FTP IT da caixa DOS, até a caixa UNIX, como um arquivo ASCII, em vez de um arquivo binário. FTP irá retirar o CRLF, e insira um lf. Transfira de volta para a caixa DOS como um arquivo binário, e o lf será retido.

Alguns editores de texto, como UltraEdit/Uestudio tem essa funcionalidade interna.

File > Conversions > DOS to UNIX

Se for apenas um arquivo, eu uso o bloco de notas ++. Bom porque é grátis. Eu tenho o Cygwin instalado e uso um script de um revestimento que escrevi para vários arquivos. Se seu interesse no script deixar um comentário. (Eu não tenho isso disponível para mim neste momento.)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top