Каков наилучший способ сделать dos2unix в линейном файле 500k в Windows? [закрытый]

вопрос говорит все это, у меня есть файл строки 500,000, который генерируется как часть процесса автоматической сборки в окне Windows, и он пронизан ^M ' s. Когда он выходит за дверь, ему нужно * nix friendly, каков наилучший подход здесь, есть ли удобный фрагмент кода, который мог бы сделать это для меня? Или мне нужно написать небольшое приложение C# или Java?

7 ответов


вот перл однострочный, взятый из http://www.technocage.com / ~caskey / dos2unix/

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

вы можете запустить его следующим образом:

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

или вы можете запустить его также таким образом (преобразование выполняется на месте):

perl -pi dos2unix.pl file.dos

и вот моя (наивная) версия C:

#include <stdio.h>

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

вы должны запустить его с перенаправлением ввода и вывода:

dos2unix.exe < file.dos > file.unix

при установке базы cygwin слишком тяжелый, есть ряд автономной dos2unix и unix2dos автономные консольные программы Windows в Сети, многие из которых имеют источник C/C++. Если я правильно понимаю требование, любое из этих решений будет хорошо вписываться в автоматический сценарий сборки.


если вы находитесь в Windows и вам нужно что-то запустить в пакетном скрипте, вы можете скомпилировать простую программу C, чтобы сделать трюк.

#include <stdio.h>

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

        if(c == EOF)
            break;

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

        fputc(c, stdout);
    }

    return 0;
}

использование:

myprogram.exe < input > output

редактирование на месте было бы немного сложнее. Кроме того, вы можете по какой-то причине сохранить резервные копии оригиналов (например, в случае случайного удаления двоичного файла).

эта версия удаляет все символы CR; если вы хотите удалить только те, которые находятся в CR-LF пара, вы можете использовать (это классический метод с одним символом: -):

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

вы можете редактировать файл на месте, используя режим "Р+". Ниже приведена общая программа myd2u, которая принимает имена файлов в качестве аргументов. Примечание: эта программа использует ftruncate оттяпать лишние символы в конце. Если есть лучший (стандартный) способ сделать это, отредактируйте или прокомментируйте. Спасибо!

#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

вы наберете ^M как: ctrl+V, введите

редактировать: вы можете использовать '\r' вместо ручного ввода возврата каретки, [спасибо @strager]

tr -d '\r' < infile > outfile

Изменить 2: "tr" - это утилита unix, вы можете скачать родную версию windows из http://unxutils.sourceforge.net[благодаря @Rob Kennedy] или использовать cygwinэмуляция unix.


Ftp его из окна dos в поле unix, как файл ascii, а не двоичный файл. Ftp будет лишать crlf и вставить lf. Перенесите его обратно в поле dos в виде двоичного файла и lf будут сохранены.


некоторые текстовые редакторы, такие как UltraEdit / UEStudio имеют эту функцию встроенной.

File > Conversions > DOS to UNIX


Если это только один файл, я использую notepad++. Хорошо, потому что это бесплатно. Я установил cygwin и использую сценарий одного лайнера, который я написал для нескольких файлов. Если вас интересует скрипт оставьте комментарий. (В данный момент у меня его нет.)