6

Windows ボックスでの自動ビルド プロセスの一部として生成される 500,000 行のファイルがあり、^Mでいっぱいです。ドアを出るとき、フレンドリーな*nixが必要です。ここでの最善のアプローチは何ですか?これを実行できる便利なコードのスニペットはありますか? それとも、ちょっとした C# や Java アプリを書く必要がありますか?

4

7 に答える 7

11

これは、 http://www.technocage.com/~caskey/dos2unix/から取得した Perl ワンライナーです。

#!/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
于 2008-11-24T01:01:56.747 に答える
6

ベースのcygwinのインストールが重すぎる場合は、ネット上に多数のスタンドアロンdos2unixおよびunix2dosWindows スタンドアロンのコンソール ベースのプログラムがあり、多くは C/C++ ソースが利用可能です。要件を正しく理解していれば、これらのソリューションのいずれも自動化されたビルド スクリプトにうまく適合します。

于 2008-11-24T02:24:09.747 に答える
5

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

モード「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;
}
于 2008-11-24T01:07:27.797 に答える
4
tr -d '^M' < infile > outfile

^M を次のように入力します: ctrl+V , Enter

編集:手動で改行を入力する代わりに「\ r」を使用できます[ @stragerに感謝]

tr -d '\r' < infile > outfile

編集 2 :「tr」は UNIX ユーティリティです。ネイティブ Windows バージョンをhttp://unxutils.sourceforge.net [ @Rob Kennedy に感謝] からダウンロードするか、cygwinの UNIX エミュレーションを使用できます。

于 2008-11-24T00:52:12.243 に答える
1

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

于 2008-11-24T00:50:05.740 に答える
1

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

File > Conversions > DOS to UNIX

于 2008-11-24T01:24:52.707 に答える
-2

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

于 2008-11-24T02:42:06.577 に答える