25

代码是这样的:

#!/bin/bash
if [[ foobarbletch =~ 'foo(bar)bl(.*)' ]]
 then
     echo "The regex matches!"
     echo $BASH_REMATCH
     echo ${BASH_REMATCH[1]}
     echo ${BASH_REMATCH[2]}
 fi

当我尝试运行它时,它不显示任何内容:

bash-3.2$ bash --version
GNU bash, version 3.2.48(1)-release (x86_64-apple-darwin12)
Copyright (C) 2007 Free Software Foundation, Inc.
bash-3.2$ /bin/bash test_rematch.bash
bash-3.2$ 

有人对此有想法吗?

4

3 回答 3

60

在您的 bash 正则表达式中,您应该删除引号。这就是为什么那行不通。

如果你有空间,我建议使用这种方式:

#!/bin/bash
x='foo bar bletch'
if [[ $x =~ foo[[:space:]](bar)[[:space:]]bl(.*) ]]
then
    echo The regex matches!
    echo $BASH_REMATCH      
    echo ${BASH_REMATCH[1]} 
    echo ${BASH_REMATCH[2]} 
fi
于 2012-10-31T02:27:56.317 回答
21

您还可以将带引号的正则表达式分配给变量:

#!/bin/bash

x='foobarbletch'

foobar_re='foo(bar)bl(.*)'

if [[ $x =~ $foobar_re ]] ; then
    echo The regex matches!
    echo ${BASH_REMATCH[*]}
    echo ${BASH_REMATCH[1]}
    echo ${BASH_REMATCH[2]}
fi

这不仅支持简单的引用,而且为正则表达式提供了一个有助于提高可读性的名称。

于 2015-08-19T18:09:26.027 回答
14

感谢您的调试语句 ,echo The regex matches!您应该已经注意到 没有问题BASH_REMATCH,因为 if 语句的计算结果为false

在 bash 中,使用 with 的正则表达式是不加=~引号的。如果右侧的字符串被引用,则将其视为字符串文字。

如果您想在正则表达式中包含空格,请使用适当的字符类,或者如果您需要空格,请转义您的空格。

于 2012-10-31T02:49:25.263 回答