Quelle est la meilleure façon de faire dos2unix sur un fichier de ligne de 500 Ko, sous Windows? [fermé]

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

  •  10-07-2019
  •  | 
  •  

Question

La question dit tout, j'ai un fichier de 500 000 lignes généré dans le cadre d'un processus de construction automatisé sur une machine Windows et rempli de ^ M . Quand il sort, il doit * réduire , quelle est la meilleure approche, existe-t-il un extrait de code pratique qui pourrait me permettre de le faire? Ou dois-je écrire une petite application C # ou Java?

Était-ce utile?

La solution

Voici un one-liner Perl, extrait de http://www.technocage.com / ~ caskey / dos2unix /

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

Vous pouvez l'exécuter comme suit:

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

Vous pouvez également l'exécuter de cette manière (la conversion est effectuée sur place):

perl -pi dos2unix.pl file.dos

Et voici ma version (naïve) C:

#include <stdio.h>

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

Vous devriez l'exécuter avec les redirections d'entrée et de sortie:

dos2unix.exe < file.dos > file.unix

Autres conseils

Si l'installation d'une base cygwin est trop lourde, il existe un certain nombre de dos2unix et unix2dos Programmes autonomes basés sur une console Windows sur le réseau, la plupart avec une source C / C ++ disponible. Si je comprends bien les besoins, l’une ou l’autre de ces solutions s’intégrerait parfaitement dans un script de construction automatisé.

Si vous utilisez Windows et que vous avez besoin d'exécuter quelque chose dans un script batch, vous pouvez compiler un simple programme en C pour faire l'affaire.

#include <stdio.h>

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

        if(c == EOF)
            break;

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

        fputc(c, stdout);
    }

    return 0;
}

Utilisation:

myprogram.exe < input > output

La modification sur place serait un peu plus difficile. En outre, vous souhaiterez peut-être conserver des sauvegardes des originaux pour une raison quelconque (par exemple, si vous supprimez accidentellement un fichier binaire).

Cette version supprime les tous caractères CR; si vous souhaitez uniquement supprimer ceux qui se trouvent dans une paire CR-LF, vous pouvez utiliser (méthode classique à un caractère: -):

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

Vous pouvez modifier le fichier sur place en utilisant le mode "r +". Vous trouverez ci-dessous un programme général myd2u, qui accepte les noms de fichiers comme arguments. Remarque: ce programme utilise ftruncate pour couper les caractères supplémentaires à la fin. S'il existe un meilleur moyen (standard) de le faire, veuillez éditer ou commenter. Merci!

#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

Vous allez taper ^ M comme suit: ctrl + V, entrez

Éditer : vous pouvez utiliser '\ r' au lieu de saisir manuellement un retour chariot, [ grâce à @strager ]

tr -d '\r' < infile > outfile

Edit 2 : 'tr' est un utilitaire Unix, vous pouvez télécharger une version Windows native à partir de http://unxutils.sourceforge.net [ grâce à @Rob Kennedy ] ou utilisez émulation unix de cygwin .

Transférez-le de la boîte de dialogue dos vers la boîte de dialogue unix, sous la forme d’un fichier ascii, au lieu d’un fichier binaire. FTP supprimera le fichier CRLF et insérera un LF . Transférez-le dans la boîte de dialogue DOS en tant que fichier binaire. lf sera conservé.

Certains éditeurs de texte, tels que UltraEdit / UEStudio , intègrent cette fonctionnalité.

Fichier > Conversions > DOS sous UNIX

S'il ne s'agit que d'un fichier, j'utilise notepad ++. Bien parce que c'est gratuit. J'ai installé cygwin et utilise un script à une ligne que j'ai écrit pour plusieurs fichiers. Si votre intérêt pour le script laissez un commentaire. (Je ne l'ai pas disponible pour moi en ce moment.)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top