当我调用shell_exec
并传递正则表达式时,我的php脚本出现问题。
PHP代码:
shell_exec("sh myscript.sh 'FOO\s*ONE'");
myscript.sh:
result=$(grep -c "${1}" myLongFile.txt)
echo ${result}
像这样,它返回0
但如果il直接使用cmd grep -c "FOO\s*ONE" myLongFile.txt
调用,则会返回23
。
如果我在我的php脚本\s
中替换了[[:space:]]
课程,那么我必须使用\s
我尝试了很多解决方案,但失败了。
答案 0 :(得分:0)
您必须使用其他\
转义\
字符,因此它会变为:
shell_exec("sh myscript.sh 'FOO\\s*ONE'");
答案 1 :(得分:0)
你需要逃避反斜杠:
shell_exec("sh myscript.sh 'FOO\\s*ONE'");
答案 2 :(得分:0)
问题不在于转义,而在于grep
是基于POSIX的;这就是您应该使用[[:space:]]
而不是\s
的原因。某些版本的grep
使用-P
选项支持PCRE语法,但使用POSIX更具可移植性。
此外,如果您想将变量从PHP传递到shell脚本,建议您使用escapeshellarg()
:
$re = 'FOO[[:space:]]*ONE';
shell_exec(sprintf("sh myscript.sh %s", escapeshellarg($re)));
应该提到的是escapeshellarg()
在Windows和Linux之间(甚至在shell之间)不能一致地工作;在某些情况下,您需要申请addcslashes()
。
答案 3 :(得分:0)
谢谢大家,
我找到了解决方案,我只是在我的脚本中为grep添加选项-P,如下所示:
result=$(grep -P -c "${1}" myLongFile.txt)
现在,我可以使用 \ s
-P, - pel-regexp 将PATTERN解释为Perl正则表达式。