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*,如
或者使用单个替换,不使用 *