Windowsで500k行のファイルでdos2unixを実行する最良の方法は何ですか? [閉まっている]

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

  •  10-07-2019
  •  | 
  •  

質問

質問では、Windowsボックスでの自動ビルドプロセスの一部として生成される500,000行のファイルがあり、それが ^ M にあふれています。 * nix フレンドリーにする必要がある場合、ここで最善のアプローチは何ですか、これを行うことができる便利なコードスニペットはありますか?または、小さなC#またはJavaアプリを作成する必要がありますか?

役に立ちましたか?

解決

これは http://www.technocage.comから取られたPerlのワンライナーです。 /〜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ペアにあるものだけを削除したい場合は、これを使用できます(これは、従来の1文字バック方式です:-):

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

モード&quot; r +&quot;を使用して、ファイルをその場で編集できます。以下は、ファイル名を引数として受け入れる一般的な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、Enter

編集:手動でキャリッジリターンを入力する代わりに「\ r」を使用できます。[ thanks to @strager ]

tr -d '\r' < infile > outfile

Edit 2 : 'tr'はUNIXユーティリティです。 http://unxutils.sourceforge.net [ @Rob Kennedyに感謝]または cygwin のUNIXエミュレーション。

バイナリファイルではなくasciiファイルとして、dosボックスからunixボックスにそれをFTPします。 Ftpは crlf を取り除き、 lf を挿入します。バイナリファイルとしてdosボックスに戻すと、 lf は保持されます。

UltraEdit / UEStudio などの一部のテキストエディターには、この機能が組み込まれています。

ファイル&gt;コンバージョン&gt; DOSからUNIXへ

ファイルが1つだけの場合は、notepad ++を使用します。無料だからいい。 cygwinをインストールし、複数のファイル用に作成した1つのライナースクリプトを使用しています。スクリプトに興味がある場合はコメントを残してください。 (現時点では、それを入手できません。)

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top