Здравствуйте, Анатолий Широков, Вы писали:
АШ>...
АШ>void main(int argc, char* argv[])
АШ>{
АШ> enum {search, show_tag} state = search;
...
АШ> while( gets(line) )
АШ> {
АШ> switch(state)
...
АШ> goto done;
...
АШ>done:
АШ> exit(0);
АШ>}
АШ>
Сложновато как-то, не находите? И никогда-никогда не вызывайте gets...
int main(int argc, char ** argv)
{
char * opentag = malloc(1 + strlen(argv[1]) + 1);
char * closetag = malloc(2 + strlen(argv[1]) + 1);
char line[LONG_ENOUGH + 1];
sprintf(opentag, "#%s\n", argv[1]);
sprintf(closetag, "#/%s\n", argv[1]);
/* Пропустить все до открывающего тэга */
while(fgets(line, LONG_ENOUGH, stdin) && strcmp(line, opentag))
;
/* Печатать все до закрывающего тэга */
while(fgets(line, LONG_ENOUGH, stdin) && strcmp(line, closetag))
puts(line);
return 0;
}
Один баг здесь еще присутствует: если среди blabla в нужном месте окажется нужный текст, файл будет обработан неправильно.
Так что по-хорошему, sed -n -e '0,/testX/d;/^#\/testX/q;0,$p/'