Bash脚本模式匹配
我需要找到6位数字的模式,而前3位数字是特定数字,但其余3位数字将是任意数字。例如,以123开头的6位数字字符串,后跟任意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,拉丁语1,UTF-8)
-是数字1
通过8
。因此,它匹配10个拉丁数字中的任何一个。
if [[ $var1 == *,123[0-9][0-9][0-9],* ]] ; then echo "Pattern matched"; fi
使用=~
而不是==
将模式类型从外壳标准“ glob”模式更改为正则表达式(简称“ regexes”)。您可以使等效的正则表达式短一些:
if [[ $var1 =~ ,123[0-9]{3}, ]] ; then echo "Pattern matched"; fi
第一个缩写来自这样一个事实,即正则表达式只必须匹配字符串的任何部分,而不是整个字符串。因此,您不需要*
在glob模式中找到与之等效的前导和尾随。
第二个长度减少是由于{n}
语法所致,它使您可以指定前一个模式的精确重复次数,而不必在正则表达式中实际重复模式本身。(您还可以通过指定最小值和最大值[0-9]{2,4}
来匹配任意范围的重复计数,例如连续匹配两位,三位或四位数字。)
值得注意的是,您也可以使用命名字符类来匹配数字。根据您的语言环境,它[[:digit:]]
可能与完全等效[0-9]
,或者可能包含来自其他脚本的具有Unicode“数字,十进制数字”属性的字符。
if [[ $var1 =~ ,123[[:digit:]]{3}, ]] ; then echo "Pattern matched"; fi
以上是 Bash脚本模式匹配 的全部内容, 来源链接: utcz.com/qa/403490.html