bash \ s特殊字符

时间:2017-11-07 17:09:31

标签: regex bash

我已经以不同的方式解决了我的问题而没有正则表达,但我会在这里留下这个问题来帮助将来遇到这个问题的人。我在模式中也犯了一个错误。我要感谢 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]相同。 (请注意,这些类名中的括号是其中的一部分   符号名称,除了必须包括在内          括号分隔括号表达式。)大多数元字符在括号表达式中失去其特殊含义。   要包含文字,请将其放在列表中的第一位。同样地,到          包括一个文字^将它放在任何地方但首先。最后,要包含一个文字 - 将它放在最后。

2 个答案:

答案 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"

这适用于我的机器。