Windowsで500k行のファイルでdos2unixを実行する最良の方法は何ですか? [閉まっている]
-
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つのライナースクリプトを使用しています。スクリプトに興味がある場合はコメントを残してください。 (現時点では、それを入手できません。)