2015-06-08 4 views
0
#include <stdlib.h> 

int foo(char *str_buf_to_grep) 
{ 
    // How to write the following line correctly? 
    return system("??? str_buf_to_grep ??? | grep mykeyword"); 
} 

Описание:Как сгладить строку в программе?

  1. str_buf_to_grep дается в любом случае, что может быть содержание текстового файла, и может быть очень долгим и сложным, даже содержит специальные символы, такие как |, " и т. д.

  2. Я хочу использовать команду grep, чтобы найти соответствующие строки, и шаблоны могут быть очень сложными.

Как его реализовать?

+1

Нет, это не очевидно. Строка в grep - это то, что следует grep, то есть mykeyword. – Jens

+1

Что вы подразумеваете под grep? Строить строку? Конкатенация? – Malina

+1

'popen' вместо – BLUEPIXY

ответ

2

Использование POPEN:

FILE* file = popen("grep mykeyword", "r"); 
fwrite(str_to_grep, 1, strlen(str_to_grep), file); 
pclose(file); 

Эхо пример Мэтт не может работать, как ожидалось, если строка имеет кавычки или аналогичный символ интерпретируется специально оболочкой.

Я предполагаю, что ваш пример с grep предназначен только для того, чтобы задать вопрос, потому что, как сказал Мэтт, во всех отношениях было бы лучше и быстрее искать подстроки самостоятельно с помощью схемы strstr или аналогичной.

3

Технически, что вы ищете это:

char cmd[1024]; 
sprintf(cmd, "echo '%s' | grep mykeyword", str_to_grep); 
return system(cmd); 

Это не будет работать, если ваш str_to_grep включает одиночные кавычки (') в нем. Вам нужно будет заменить одиночные кавычки косой чертой + quote (\ '), чтобы избежать интерполяции оболочки.

Однако, я не могу понять, почему вы хотите раскошеливаться grep команды, а не использовать strstr() функцию, например:

strstr(str_to_grep, "mykeyword"); 

Последнее всегда более эффективно, меньше набирать, более портативными , и меньше склонности к ошибкам.

+0

Что делать, если str_to_grep очень длинный и сложный? – xmllmx

+2

или имеет | в этом. –

+0

Вам нужно закрыть трубку позже? –

Смежные вопросы