liunx正则危险符号“*”星号

liunx正则的符号,危险符号“*”,下面介绍它是如何危险的

*:在正则中表示匹配0次或者1次或者多次,注意他的贪婪性

1.*与grep连用----使用正常

新建一个文本文件,内容如下

liunx正则危险符号“*”星号

 cat 与grep连用,红色表示匹配成功,匹配原理

liunx正则危险符号“*”星号

 匹配原理:

一行:在第二个b查找了b,所以能匹配了b,匹配一次原理

第二行:查询到第一个b匹配,有查找到第二个b,也可匹配,匹配多次原理

第二行:查询到第一个b匹配,有查找到第二个b,查询到第个b,也可匹配,匹配多次原理

而grep匹配的0次,匹配不成

liunx正则危险符号“*”星号

2.*与sed连用-----使用危险

sed符号是一个替换符号,用于文件替换,现在我们像grep一样,把b替换成z,按照我最开始的写法,只要有b的都替换成z,所以写法是

sed “s/b*/z/g”  含义sed  "s/查找字符/替换字符/全局替换",但是下面的结果另外们大吃一惊,为什么会这样

原始字符

liunx正则危险符号“*”星号

 替换后的字符

liunx正则危险符号“*”星号

猜测原因:

1.在匹配时把字符拆成,前中后,3段

第一行:第一个字符为a,匹配到了0个,前面匹配成z,保留了a,第二个字符找到了b,替换成z, 第三个字符c也是匹配到0个,新增一个z,后面新增

第二行:同理,拆成前中后,abbc  ,第一个匹配0个,新增z,第二个字符与第三个字符满足匹配,匹配成功,替换成z,第四个字符,不能匹配,但是匹配到了0个,后续新增一个z

第三行:拆成前中后,abbbcd  ,第一个匹配0个,新增z,第二个字符、第三个字符、第四个字符满足匹配,匹配成功,替换成z,第五个字符,不能匹配,匹配0个,新增z,d同理,新增一个z

总结,*号与sed连用太危险  如果真的要替换b要使用*,使用两个bb*,如

liunx正则危险符号“*”星号

 或者使用单个替换,不使用*

liunx正则危险符号“*”星号

相关推荐