如何在bash中使用正则表达式匹配空白字符?

时间:2015-10-30 08:44:56

标签: regex bash

我需要匹配"?xml'这就是我想要的'?",并获得单引号之间的字符串。
我试试这个:

if [[ '?xml   abc def?' =~ \?xml(.*)\? ]]; then
    echo ok;
    echo "${BASH_REMATCH[1]}";
fi

结果:

ok
   abc def

我只想要' abc def'。所以我试试:

if [[ '?xml    abc def?' =~ \?xml[:blank:]+(.*)\? ]]; then #nothing matched
if [[ '?xml    abc def?' =~ \?xml\[:blank:\]+(.*)\? ]]; then #nothing matched
if [[ '?xml    abc def?' =~ \?xml\s+(.*)\? ]]; then #nothing matched

如何解决此问题?帮助!

2 个答案:

答案 0 :(得分:1)

您需要在另一个括号(字符类)中包含[:blank:]

$ if [[ '?xml   abc def?' =~ \?xml[[:blank:]]+(.*)\? ]]; then     echo ok;     echo "${BASH_REMATCH[1]}"; fi
ok
abc def

答案 1 :(得分:1)

您可以使用[[:space:]]删除所有空格:

if [[ '?xml   abc def?' =~ \?xml[[:space:]]*(.*)\? ]];
                                ^^^^^^^^^^^^

注意括号表达式(或POSIX字符类)两端的2个方括号。根据regular-expressions.info:

  

POSIX语法...只能在括号表达式中使用。

     

[x-z0-9]是本教程称之为“字符类”的示例,以及POSIX称之为“括号表达式”的示例。

请参阅demo

[:space:] POSIX字符类匹配[ \t\r\n\v\f]个字符。

详细了解POSIX character classes at regular-expressions.info