在我的c ++程序中,我想执行perl命令并读取执行返回的输出。我使用popen,但执行命令时出错:
命令:
string cmd = "perl -ne 's/^\\S+\\s//; if ((/" +
pattern1+ " START/ .. /" + pattern2+ " END/) && /find/)"
" { print \"$_\"}' file";
stream = popen(cmd.c_str(),"r");
如果我在命令行中执行此命令,它可以工作,但在C ++中我收到此错误:
Search pattern not terminated at -e line 1.
在命令行中运行的命令是,在C ++中我已经转义了'\'和'“':
perl -ne 's/^\\S+\\s//; if ((/aaa START/ .. /bbb END/) && /find/) { print "$_"}' file
如果我执行此命令,它的工作原理为:“perl -ne print $ _ file”。 但我最初的命令却没有。 我做错了什么。感谢。
答案 0 :(得分:1)
这是你的转义字符\
。当\\
变为\
时,您必须在C ++字符串中将它们加倍。然后shell就像你在命令行上看到的那样进行处理。即另一轮\\
变为\
。
答案 1 :(得分:1)
你需要逃避反斜杠(通过添加更多的反斜杠!)。
std::string cmd = "perl -ne 's/^\\\\S+\\\\s//; if ((/" +
pattern1 + " START/ .. /" +
pattern2+ " END/) && /find/)"
" { print \"$_\"}' file";
在C ++ 0x中,您可以使用原始R"(strings)"
来避免添加斜杠。与GCC一样编译,如
g++ -std=c++0x -Wall popen.cpp
示例:
std::string cmd_raw = R"(perl -ne 's/^\\S+\\s//; if ((/)" +
pattern1 + R"( START/ .. /)" +
pattern2 + R"( END/) && /find/))"
R"( { print \"$_\"}' file)";
答案 2 :(得分:0)
这有效:
cmd = "perl -ne 's/^\\\\S+\\\\s//; if ((/" +
pattern1+ " START/ .. /" + pattern2+ " END/) && /find/)"
" { print \"$_\"}' file";
stream = popen(cmd.c_str(),"r");