linux – Bash脚本模式匹配

我需要一个找到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-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

相关文章

/etc/sysctl.conf这个目录主要是配置一些系统信息,/etc/sys...
1.作用 useradd或adduser命令用来建立用户帐号和创建用户的起...
它们都是多模式编辑器,不同的是vim 是vi的升级版本,它不仅...
不管是我们在安装软件还是监测软件的使用性能,我们都要随时...
装好Tomcat7后,发现除了本机能访问外界访问不了,岂有此理。...
修改防火墙配置需要修改 /etc/sysconfig/iptables 这个文件,...