我需要找到6位数的模式,前3位是特定数字,但剩下的3位数字是任意数字。 例如,6位数字符串以123开头,后跟任意3位数字。
var1="abc,123111,"
var2="abcdefg,123222,"
var3="xyzabc,987111,"
if [[ $var1 == *",123ddd,"* ]] ; then echo "Pattern matched"; fi
其中ddd是任何数字。 var1和var2将与模式匹配,但var 3不匹配。我似乎无法做到恰到好处。
答案 0 :(得分:8)
使用字符类:[0-9]
匹配0
,9
以及字符集中它们之间的每个字符,至少在Unicode和子集字符集中(US-ASCII) ,Latin-1,UTF-8) - 是1
到8
的数字。所以它匹配10个拉丁数字中的任何一个。
if [[ $var1 == *,123[0-9][0-9][0-9],* ]] ; then echo "Pattern matched"; fi
使用=~
而不是==
更改shell标准" glob"中的模式类型模式到正则表达式(" regexes"简称)。你可以将等效的正则表达式缩短一点:
if [[ $var1 =~ ,123[0-9]{3}, ]] ; then echo "Pattern matched"; fi
第一个缩短来自这样一个事实:正则表达式只需要匹配字符串的任何部分,而不是整个事物。因此,您不需要等效于在glob模式中找到的前导{和{1}}。
第二个长度减少是由于*
语法,它允许您指定前一个模式的确切重复次数,而不是在正则表达式中实际重复模式本身。 (您还可以通过指定最小值和最大值来匹配任何一系列重复计数,例如{n}
以匹配行中的两个,三个或四个数字。)
值得注意的是,您还可以使用命名字符类来匹配数字。根据您的语言环境,[0-9]{2,4}
可能与[[:digit:]]
完全等效,或者它可能包含来自其他脚本的字符,其中包含Unicode" Number,Decimal Digit"属性。
[0-9]
答案 1 :(得分:1)
Bash 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