I recently ran into the situation that I needed a streaming editor which does not work line-wise. I was receiving an html stream and wanted to remove all the html tags.
Although I tried different existing editors like sed or replace, non of it got it right for me. All implementations waited for a newline to work with the data. I also tried disabling every possible buffer but the problem still persists.
So after quite some trial and error I started writing my own little program which could do the job. So here is the code:
#include <stdio.h>
#include <string.h>
int main (int argc, char* argv[])
{
setbuf(stdin,NULL);
char c;
int tag =0;
do {
c = getchar();
if (c == '<' && tag==0) ++tag;
if (c == '>' && tag>0) {--tag; c='\n';}
if (tag ==0 ){
putchar(c);
fflush(stdout);
}
} while (c != EOF);
return 0;
}
Just compile it with the following statement and it will filter everything which comes from stdin.
gcc -fPIC -Wall -otransform transform.c
Here is a sample statement of how to use it:
curl -N -s google.com | ./transform