加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Linux > 正文

linux – Bash脚本模式匹配

发布时间:2020-12-14 01:20:48 所属栏目:Linux 来源:网络整理
导读:我需要一个找到6位数的模式,前3位是特定的数字,但剩下的3位数字是任何数字. 例如,6位数字符串以123开头,后跟任意3位数字. var1="abc,123111,"var2="abcdefg,123222,"var3="xyzabc,987111,"if [[ $var1 == *",123ddd,"* ]] ; then echo "Pattern matched"; fi
我需要一个找到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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读