Я использую код C с sed. Я хочу прочитать строки в интервале 1-10,11-20 и т. д., чтобы выполнить некоторые вычисления.
int i,j,m,n;
for(i=0;i<10;i++){
j=i+1;
//correction. m,n is modified which was incorrect earlier.
m=i*10;
n=j*10;
system("sed -n 'm,n p' oldfile > newfile");
}
Выход.
m,n p
Похоже, переменная не передается в систему. Есть ли способ сделать это?
если вы хотите перенаправить вывод в файл, лучше сохраните путь с помощью sprintf
вместе с командой и используйте его.
в C нет замены $<variable>
.
Интересно, мы все использовали 100
для размера буфера
"100 байт должно хватить всем" :)
@IrAM моя ошибка, это должно быть m,n p, где m=i*10; n=j*10, который должен исходить из кода C.
Изучите главу об обработке строк в своей книге по программированию на C.
Мне кажется, что вы должны использовать m = 10 * i + 1; n = 10 * (i + 1);
, чтобы получить диапазоны 1-10 для i = 0
, 11-20 для i = 1
и т. д. (и j
становится неактуальным). Ваш код генерирует 0-10, 10-20, 20-30 и т. д., что сильно отличается, не в последнюю очередь потому, что 0 не обязательно приемлем для sed
, а диапазоны перекрываются.
Вызов sed
внутри C
похож на наличие всего арсенала инструментов, но выбор кувалды для покраски стены. Не могли бы вы просто не читать файл построчно, а когда дойдете до интересующих строк, сохранить 10 строк в буфере и выполнить постобработку буфера для вычислений.
Использование system
для запуска подпроцессов может быть небезопасным. Если вам нужны внешние инструменты для выполнения задачи, рассмотрите возможность использования fork
/exec
/waitpid
вместо system
. Это будет не только безопаснее, но и более гибко, даст вам асинхронность, лучшее обнаружение ошибок и т. д.
Используйте sprintf
для создания командной строки:
char cmdline[100];
sprintf(cmdline, "sed -n '%d,%dp' oldfile.txt > newfile.txt", 10*i+1, 10*(i+1));
puts(cmdline); // optionally, verify manually it's going to do the right thing
system(cmdline);
(Это уязвимо для переполнения буфера, но если ваши аргументы командной строки не слишком гибки, 100 байт должно быть достаточно.)
Выполнение кода, созданного с помощью манипуляций со строками, может иметь более серьезные проблемы, чем переполнение буфера. Однако в данном случае это выглядит нормально, это просто предупреждение для других читателей. Особенно пользователи SQL.
Вы не можете заменить часть строкового литерала в C. Вам нужно
sprintf()/snprintf() будет вашим другом в этом. Вы можете сделать что-то вроде (копирование из комментария pmg)
char cmd[100];
snprintf(cmd, 100, "sed -n '%d,%dp' oldfile > newfile", 10*i+1, 10*(i+1));
system(cmd);
Я не очень привык к
sed
, но работает ли команда нормально, когда вы делаете то же самое в оболочке?