Bash脚本模式匹配

时间:2017-06-22 01:00:55

标签: linux bash shell scripting

我需要找到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不匹配。我似乎无法做到恰到好处。

2 个答案:

答案 0 :(得分:8)

使用字符类:[0-9]匹配09以及字符集中它们之间的每个字符,至少在Unicode和子集字符集中(US-ASCII) ,Latin-1,UTF-8) - 是18的数字。所以它匹配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