如何在程序中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");
}
描述:
str_buf_to_grep
以任何方式给出,可能是文本文件的内容,可能很长很复杂,甚至包含特殊字符,如|
、"
、等等
我想用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 循环或类似方法自己查找子字符串在所有方面都会更好更快。
#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");
}
描述:
str_buf_to_grep
以任何方式给出,可能是文本文件的内容,可能很长很复杂,甚至包含特殊字符,如|
、"
、等等我想用
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 循环或类似方法自己查找子字符串在所有方面都会更好更快。