我需要一个找到6位数的模式,前3位是特定的数字,但剩下的3位数字是任何数字.
例如,6位数字符串以123开头,后跟任意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-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模式中找到的前导*和尾随*的等价物.
第二个长度减少是由于{n}语法,它允许您指定前一个模式的确切重复次数,而不是在正则表达式中实际重复模式本身. (您还可以通过指定最小值和最大值来匹配任何一系列重复计数,例如[0-9] {2,4}以匹配行中的两个,三个或四个数字.)
值得注意的是,您还可以使用命名字符类来匹配数字.根据您的语言环境,[[:digit:]]可能与[0-9]完全等效,或者它可能包含其他具有Unicode“Number,Decimal Digit”属性的脚本中的字符.
if [[ $var1 =~,123[[:digit:]]{3},]] ; then echo "Pattern matched"; fi