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

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

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

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

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

 

 

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

 

 

 匹配原理:

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

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

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

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

 

 

 

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

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

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

原始字符

 

 替换后的字符

 

猜测原因:

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*,如

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