我试图通过为df1 = data[data.result==0]
df2 = data[data.result==1]
,-?
或-h
添加帮助开关来检查是否已将帮助开关传递给我的程序。如果没有,我只需将所有内容转发给另一个脚本,如下所示:
--help
出于某种原因,这似乎并不适用于我的系统。我追踪到if echo "$*" | egrep -q -- '-?|-h|--help'; then
help
exit 0
fi
exec another/script "$@"
成功返回空字符串搜索的事实,例如这将打印egrep
:
0
为什么会发生这种情况,我该怎么做才能解决这个问题?谢谢!
编辑:还注意到,虽然此命令会成功:
echo '' | egrep -q -- '-?|-h|--help'
echo $?
将其与常规echo -h | egrep -- -?
echo $? # 0
一起使用将失败:
grep
我假设扩展grep将echo -h | grep -- -?
echo $? # 1
视为特殊字符,那么呢?
答案 0 :(得分:2)
在正则表达式中,?
表示前一个字符的零个或一个副本,在本例中为-
。因此-?
表示-
的零或一个匹配。 -
的零匹配匹配空字符串,因此这个正则表达式将匹配所有内容。你需要转义?
所以它将按字面解释,而不是正则表达式元字符。
egrep -q -- '-\?|-h|--help'
答案 1 :(得分:1)
这是因为?
是shell中的特殊模式字符,并且在正则表达式中区别对待。看看man bash:
Pattern Matching
...
The special pattern characters have the following meanings:
...
? Matches any single character
所以在你的例子中:
echo -h | egrep -- -?
echo $? # 0
'?'
是前一个字符-
的零或1次重复。 (正如评论中正确指出的那样)正则表达式 '?'
失去了与单个字符匹配的特殊含义,而是指zero
或{{1}的匹配}次。要保留字符本身,您需要明确请求1
和-
本身,例如字符类
?