lrjnlp 2020-07-19
liunx正则的符号,危险符号“*”,下面介绍它是如何危险的
*:在正则中表示匹配0次或者1次或者多次,注意他的贪婪性
新建一个文本文件,内容如下
cat 与grep连用,红色表示匹配成功,匹配原理
匹配原理:
一行:在第二个b查找了b,所以能匹配了b,匹配一次原理
第二行:查询到第一个b匹配,有查找到第二个b,也可匹配,匹配多次原理
第二行:查询到第一个b匹配,有查找到第二个b,查询到第个b,也可匹配,匹配多次原理
而grep匹配的0次,匹配不成
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*,如
或者使用单个替换,不使用*