ما هي أفضل طريقة للقيام dos2unix على 500k خط ملف في ويندوز ؟ [مغلقة]

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

  •  10-07-2019
  •  | 
  •  

سؤال

السؤال يقول كل شيء ، لقد حصلت على 500,000 خط الملف الذي يحصل إنشاؤها كجزء من بناء الآلي العملية على ويندوز مربع وانها مليئة ^M's.عندما يخرج من الباب فإنه يحتاج إلى *nix ودية, ما هو أفضل نهج ها هنا مفيد مقتطف من التعليمات البرمجية التي يمكن أن تفعل هذا من أجلي ؟ أو هل أنا بحاجة أن أكتب قليلا C# أو جافا التطبيق ؟

هل كانت مفيدة؟

المحلول

هنا هو بيرل بطانة واحدة ، مأخوذة من 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

وهنا هو بلدي (السذاجة) ج الإصدار:

#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 ويندوز مستقل القائم على وحدة البرامج على الشبكة ، مع العديد من C/C++ المصدر المتاحة.إذا أنا التفاهم شرط صحيح ، أي من هذه الحلول من شأنها أن تناسب بشكل جيد في آلية بناء السيناريو.

إذا كنت على ويندوز تحتاج إلى شيء المدى في دفعة النصي, يمكنك تجميع بسيط برنامج 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-إذا زوج ، يمكنك استخدام (هذا هو كلاسيكي حرف واحد-مرة أخرى الطريقة :-):

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

يمكنك تحرير الملف في المكان باستخدام وضع "r+".وفيما يلي العامة 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 أدخل

تحرير:يمكنك استخدام ' ' بدلا من يدويا إدخال النقل العودة ، [شكرا @strager]

tr -d '\r' < infile > outfile

تحرير 2:'tr' هو unix الأداة, يمكنك تحميل نسخة ويندوز الأصلية من http://unxutils.sourceforge.net[شكرا @روب كينيدي] أو استخدام cygwin's unix مضاهاة.

Ftp من دوس مربع إلى مربع unix ، ملف ascii بدلا من ملف ثنائي.Ftp الشريط crlf, و إدراج لو.نقل مرة أخرى إلى المربع dos الثنائية الملف ، لو سيتم الاحتفاظ بها.

بعض برامج تحرير النصوص مثل برنامج Ultraedit/UEStudio هذا وظيفة المدمج في.

File > Conversions > DOS to UNIX

إذا كان ملف واحد فقط انا استخدم notepad++.لطيفة لأنه مجاني.لدي cygwin تثبيت و استخدام سفينة واحدة النصي كتبت لملفات متعددة.إذا كان لديك مصلحة في السيناريو ترك تعليق.(لا يكون متاحا لي هذه اللحظة.)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top