2013-07-31 2 views
22

数字を含む正規表現に対していくつかの行をマッチさせようとしています。正規表現の数字の一致方法

Bashのバージョン3.2.25:

#!/bin/bash 

s="AAA (bbb 123) CCC" 
regex="AAA \(bbb \d+\) CCC" 
if [[ $s =~ $regex ]]; then 
    echo $s matches $regex 
else 
    echo $s doesnt match $regex 
fi 

結果:

AAA (bbb 123) CCC doesnt match AAA \(bbb \d+\) CCC 

私はそれが動作regex="AAA \(bbb .+\) CCC"を置くが、それは数字だけを一致させるために、私の要件を満たしていない場合。

なぜですか\d+が一致します123

答えて

31

標準文字セットやPOSIX準拠の表記を使用します:代わりに[0-9]を使用Finding only numbers at the beginning of a filename with regexに読んで

[0-9]  
[[:digit:]]  

を:

\d\wを動作しません。 POSIX regular expressionsには、を使用できます210これらの

ので、あなたの表現があるべき1

かかわら:

regex="AAA \(bbb [0-9]+\) CCC" 
#    ^^^^^^ 
regex="AAA \(bbb [[:digit:]]+\) CCC" 
#    ^^^^^^^^^^^^ 

すべて一緒に、あなたのスクリプトは、このようなことができます:

#!/bin/bash 

s="AAA (bbb 123) CCC" 
regex="AAA \(bbb [[:digit:]]+\) CCC" 
if [[ $s =~ $regex ]]; then 
    echo "$s matches $regex" 
else 
    echo "$s doesn't match $regex" 
fi 

のは、それを実行してみましょう:

$ ./digits.sh 
AAA (bbb 123) CCC matches AAA \(bbb [[:digit:]]+\) CCC 
6

数字表記\dは、bashバージョンでは動作しません。どちらの

regex="AAA \(bbb [0-9]+\) CCC" 
+0

少なくともbash 4.3.11(Ubuntu 14.04に付属のもの) '[0-9] +'は動作しませんしかし、[[0-9] * 'はします。おそらく '+'はサポートされていませんか? –

+0

'' [0-9] + 'は古いBASH 3.2でもうまくいきましたが、なぜUbuntu BASHがそれを好きではないのか分かりません。 – anubhava

+0

Hmmm、決して気にしないで、私は混乱しました。それは '+'を扱わない 'grep 'です(少なくとも追加のオプションはありません)。私のスクリプトはbash regex matching *と* grepの両方を使用しているので混乱します。 –

関連する問題