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 REGEXでは、引用符を削除する必要があります。それがうまくいかない理由です。

スペースがある場合は、次のように使用することをお勧めします。

#!/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

デバッグステートメントのおかげで、ifステートメントは。と評価されるため、にecho The regex matches!問題がないことに気付くはずです。BASH_REMATCHfalse

bashでは、で使用される正規表現=~は引用符で囲まれていません。右側の文字列が引用符で囲まれている場合は、文字列リテラルとして扱われます。

正規表現に空白を含める場合は、適切な文字クラスを使用するか、スペースが必要な場合はスペースをエスケープします。

于 2012-10-31T02:49:25.263 に答える