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

3

我需要匹配类似于"?xml 'this is what I want'?"的内容,并获取单引号之间的字符串。
我尝试了以下方法:

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

我该如何解决这个问题?帮帮我!


你可以尝试使用\s*。我不确定PCRE是否已启用。否则,:blank:需要用双方括号[[:blank:]]括起来。 - hjpotter92
2个回答

1

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

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

1
您可以使用[[:space:]]来删除所有空格:
if [[ '?xml   abc def?' =~ \?xml[[:space:]]*(.*)\? ]];
                                ^^^^^^^^^^^^

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

POSIX语法…只能在方括号表达式内使用。

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

请参见演示

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

有关regular-expressions.info上的POSIX字符类的更多信息,请参见。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接