2017-06-22 114 views
1

我需要找到6位數字的模式,前3位數字是特定數字,但其餘3位數字是任何數字。 例如,以123開頭,後跟任意3位數的6位數字字符串。Bash腳本模式匹配

var1="abc,123111," 
var2="abcdefg,123222," 
var3="xyzabc,987111," 

if [[ $var1 == *",123ddd,"* ]] ; then echo "Pattern matched"; fi 

其中ddd是任何數字。 var1和var2會匹配模式,但var 3不會。我似乎無法讓它恰到好處。

回答

3

使用glob模式匹配,使用字符類:[0-9]匹配0,9,並且每個字符它們之間的字符集由字符組成,它們由數字18組成。所以在Unicode和子集字符集(US-ASCII,Latin-1,UTF-8)中,它匹配所有10個拉丁數字。

if [[ $var1 == *,123[0-9][0-9][0-9],* ]] ; then echo "Pattern matched"; fi 

使用匹配,而不是水珠匹配的正則表達式(「正則表達式」),就可以在一定程度縮短模式:

if [[ $var1 =~ 123[0-9]{3} ]] ; then echo "Pattern matched"; fi 

隨着=~,正則表達式只匹配字符串的任意部分,不是全部。所以你不需要等同於你在glob模式中找到的前導和尾隨*

{n}語法可讓您指定前一模式的確切重複次數,因此您無需在正則表達式中重複模式本身。您還可以通過指定最小值和最大值來匹配重複次數範圍中的任何一個,例如[0-9]{2,4}以匹配連續兩個,三個或四個數字。

最後,您還可以使用指定的字符類來匹配數字。根據您的區域設置,[[:digit:]]可能完全等效於[0-9],或者它可能包含Unicode「Number,Decimal Digit」屬性的其他腳本的字符。

if [[ $var1 =~ ,123[[:digit:]]{3} ]] ; then echo "Pattern matched"; fi 
+0

很好地完成。 Quibble:'[0-9]'匹配(有效的)LC_CTYPE值(參見'locale')定義的範圍'0'到'9'範圍內的字符。在現在無處不在的基於UTF-8的語言環境中,這與ASCII/Latin-1字符'0'到'9'一致,因爲這些編碼是Unicode的真正_subsets_。相比之下,[[:digits:]]不僅匹配'0'到'9',而且還匹配UTF-8中的附加字符,這是Unicode標準認爲是數字的基礎。 – mklement0

1

猛砸glob模式匹配[0-9]可以用來匹配數字:

if [[ $var1 == *,123[0-9][0-9][0-9],* ]] ; then echo "Pattern matched"; fi 

或者,你可以使用正則表達式匹配=~

if [[ $var1 =~ .*,123[0-9]{3},.* ]] ; then echo "Pattern matched"; fi