Каков наилучший способ сделать 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 и использую сценарий одного лайнера, который я написал для нескольких файлов. Если вас интересует скрипт оставьте комментарий. (В данный момент у меня его нет.)