我已经以不同的方式解决了我的问题而没有正则表达,但我会在这里留下这个问题来帮助将来遇到这个问题的人。我在模式中也犯了一个错误。我要感谢 anubhava 。他的回答对我很有帮助。在bash中,正则表达式\ s不符合您期望的空格。如果要匹配空格或制表符,则必须使用[[:blank:]]。 此示例正常工作:
[[ "import scala" =~ ^import[[:blank:]]+scala$ ]] && echo "yes"
但这不起作用:
[[ "import scala" =~ ^import\s+scala$ ]] && echo "yes"
这是grep手册页的一部分:
最后,预定义了某些命名的字符类 括号表达式,如下。他们的名字不言自明, 它们是[:alnum:],[:alpha:],[:cntrl:],[:digit:], [:graph:],[:lower:],[:print:],[:punct:],[:space:],[:upper:]和[:xdigit:]。例如,[[:alnum:]]表示 当前语言环境中的数字和字母的字符类。在C中 locale和ASCII字符集编码,这与[0-9A-Za-z]相同。 (请注意,这些类名中的括号是其中的一部分 符号名称,除了必须包括在内 括号分隔括号表达式。)大多数元字符在括号表达式中失去其特殊含义。 要包含文字,请将其放在列表中的第一位。同样地,到 包括一个文字^将它放在任何地方但首先。最后,要包含一个文字 - 将它放在最后。
答案 0 :(得分:5)
\s
不适用于bash正则表达式。请改用[[:blank:]]
来匹配空格或制表符:
[[ "import scala" =~ ^import[[:blank:]].*scala$ ]] && echo "yes"
yes
PS:但[[:space:]]
相当于\s
,也匹配\n
另请注意,您必须在.*
之前使用.+
代替scala
来匹配0个或更多字符而不是1个字符,因为已使用[[:blank:]]
<匹配空格/ p>
答案 1 :(得分:0)
\ s将在shell中失去其含义(转为's'),请尝试按照bash手册中的建议使用变量来存储正则表达式:
ex='^import\s+scala$'; [[ "import scala" =~ $ex ]] && echo "yes"
这适用于我的机器。