如何在程序中grep一个字符串?

How to grep a string in a program?

#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命令查找匹配的行,模式可能很复杂。

我该如何实施?

从技术上讲,您正在寻找的是:

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

如果您的 str_to_grep 包含单引号 ('),这将不起作用。您需要将单引号替换为斜杠+引号 (\') 以避免 shell 插值。

但是,我无法理解您为什么要 shell 输出到 grep 命令,而不是使用 strstr() 函数,如下所示:

strstr(str_to_grep, "mykeyword");

后者总是更高效、更少打字、更便携且更不容易出错。

使用 popen:

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

如果字符串包含由 shell 专门解释的引号或类似字符,Matt 的回显示例可能无法按预期工作。

我假设您使用 grep 的示例只是为了提出问题 - 因为就像 Matt 所说的那样,使用 strstr 循环或类似方法自己查找子字符串在所有方面都会更好更快。