Каков наилучший способ сделать dos2unix в файле размером 500 тысяч строк в Windows?[закрыто]
-
10-07-2019 - |
Вопрос
Вопрос говорит сам за себя, у меня есть файл в 500 000 строк, который генерируется как часть автоматизированного процесса сборки в окне Windows, и он пронизан ^Мс.Когда он выходит за дверь, ему нужно *никс дружелюбный, какой здесь наилучший подход, есть ли удобный фрагмент кода, который мог бы сделать это за меня?Или мне нужно написать небольшое приложение на C # или Java?
Решение
Здесь приведен однострочный текст Perl, взятый из http://www.technocage.com / ~ Каски / 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 и вам нужно что-то запустить в пакетном скрипте, вы можете скомпилировать простую программу на языке Си, чтобы выполнить этот трюк.
#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;
}
Вы можете отредактировать файл на месте, используя режим "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, Enter
Изменить . Вы можете использовать '\ r' вместо ручного ввода возврата каретки, [ благодаря @strager ]
tr -d '\r' < infile > outfile
Редактировать 2 : 'tr' - это утилита для Unix, вы можете загрузить собственную версию Windows с http://unxutils.sourceforge.net [ благодаря @Rob Kennedy ] или используйте эмуляция unix cygwin .
Перенесите его из поля dos в поле unix как файл ascii вместо двоичного файла. Ftp лишит crlf и вставит lf . Перенесите его обратно в поле dos в виде двоичного файла, и lf будет сохранен.
Некоторые текстовые редакторы, такие как UltraEdit / UEStudio имеют эту встроенную функцию.
Файл > Конверсии > DOS в UNIX
Если это всего лишь один файл, я использую notepad ++. Хорошо, потому что это бесплатно. Я установил Cygwin и использую сценарий с одним вкладышем, который я написал для нескольких файлов. Если ваш интерес к сценарию оставьте комментарий. (У меня нет этого в данный момент для меня.)