Один раз мне потребовалось выполнить над файлом размером 74МБ команду
sed 's/),(/);\ninsert into kladr(name,socr,code,idx,gninmb,uno,ocatd,status)values(/g'
Команда выполнялась несколько часов и сильно грузила проц. В качестве решения была написана собственная программа замены строк
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int usage(char* name){
fprintf(stderr,"Usage: %s findStr replTo\n", name);
return 1;
}
int main(int argc, char**argv){
if(argc!=1+2){
return usage(argv[0]);
}
const char* findStr=argv[1];
int findStrLen=strlen(findStr);
const char* replTo=argv[2];
char *buf=malloc(findStrLen);
int buflen=0;
int c;
while((c=getc(stdin))!=EOF){
if(c==findStr[0]){
buf[buflen++]=c;
for(int i=1;i<findStrLen;i++){
if((c=getc(stdin))!=EOF){
buf[buflen++]=c;
if(c==findStr[ i ])
continue;
}
for(int j=0;j<buflen;j++)
putc(buf[j],stdout);
goto lNextWhile;
}
fputs(replTo,stdout);
buflen=0;
}else
putc(c,stdout);
lNextWhile:
;
}
free(buf);
return 0;
}
$ cat makefile
APP=sosed
all:$(APP)
$(APP): sosed.c
gcc -O3 -std=c99 -o$@ sosed.c
Эта команда выполняется над теми же данными за несколько секунд
sosed "),(" ");
> insert into kladr(name,socr,code,idx,gninmb,uno,ocatd,status)values(" < test > test2
Дальнейшее развитие - многопоточность