免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 2061 | 回复: 17
打印 上一主题 下一主题

[文本处理] 求助,正则表达式有不懂的地方 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2017-02-07 09:52 |只看该作者 |倒序浏览
刚开始学习linux1个月,在大致读完PC篇后想先从SHELL学起,之后再学习Python。用的参考书是linux命令行与shell脚本编程大全。目前学到了正则表达式的部分,但是有疑问,得到希望各位前辈的指教,先谢谢大家了。
从最开始说起吧,都是关于gawk匹配语句的
第一个问题是这样的:echo "bt"|gawk '/b[ae]?t/{print $0}',echo "bat"|gawk '/b[ae]?t/{print $0}',echo "bet"|gawk '/b[ae]?t/{print $0}',echo "beat"|gawk '/b[ae]?t/{print $0}'都匹配上了没毛病,问题是我不能理解为什么echo "bot"|gawk '/b[ae]?t/{print $0}'这样一条语句是不能匹配的。书中说“?”表示字符组中的数字出现了0或1次就匹配成功,bt是因为中间没有字符,所以是0次,匹配成功,bot因为中间是o,并没有出现a或者e,那是不是应该也是0次,为什么匹配不成功?
第二个问题:和上面很类似echo "beot"|gawk '/b[ae]+t/{print $0}'为什么同样无法匹配
再来第三个:echo "beaot"|gawk --re-interval '/b[ae]{1,2}t/{print $0}'无法匹配,但是修改前面的语句变为echo "beaot"|gawk --re-interval '/b[ae]{1,2}/{print $0}'是可以匹配的,为什么
最后一个问题,书中说echo "saturday"|gawk '/sat(urday)?/{print $0}'匹配上,我自己尝试分别使用echo “saturday1”、"sat1urday"、"sat1u2rday"都能匹配上,后来我修改语句为echo "saturday"|gawk '/sat(urda)?y/{print $0}'时,发现saturday1234也能匹配上,但是当echo “saturda2y”、"sat1urday"、"sat1u2rday"都是无法匹配的,请问为什么?我是哪个地方没有理解透彻?
最后先谢谢大家的宝贵时间,求指教!

论坛徽章:
1
15-16赛季CBA联赛之江苏
日期:2016-10-26 16:19:04
2 [报告]
发表于 2017-02-07 10:16 |只看该作者
echo "bot"|gawk '/b[ae]?t/{print $0}'  这个bot中间的o是没匹配上,bt之间没有任何字符为0,有别的字符为其他字符,不能当0处理。其余的大概都是这个样子,多看看正则的规则,这些都不是问题。

论坛徽章:
0
3 [报告]
发表于 2017-02-07 13:47 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
4 [报告]
发表于 2017-02-07 13:47 |只看该作者
fh21_xuejinlian 发表于 2017-02-07 10:16
echo "bot"|gawk '/b[ae]?t/{print $0}'  这个bot中间的o是没匹配上,bt之间没有任何字符为0,有别的字符为 ...

首先谢谢你的回复,正如你说的这个bt之间有别的字符为其他字符不能当0处理,那之前我问的最后那个问题里面当echo "sat1urday"|gawk '/sat(urday)?/{print $0}'或者echo "sat1urda2y"|gawk '/sat(urday)?/{print $0}'再或者echo "sat1urdaaaaa2y"|gawk '/sat(urday)?/{print $0}'时为什么又能匹配上了呢?修改为echo "saturda2y"|gawk '/sat(urda)?y/{print $0}'为啥又不能匹配上了?

论坛徽章:
0
5 [报告]
发表于 2017-02-07 13:50 |只看该作者
回复 3# 本友会机友会摄友会

啊,我刚开始学,用的是OS7,我希(估)望(计)的(很)是(难)在学习开始把一些基础的知识理解透彻点,在以后的学习和应用中少碰到些低级错误

论坛徽章:
0
6 [报告]
发表于 2017-02-07 14:18 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
7 [报告]
发表于 2017-02-07 14:41 |只看该作者
本友会机友会摄友会 发表于 2017-02-07 14:18
你说的这些,我还真不会,但是我照样觉得我是脚本牛人。
1 用的时候我就靠正则测试。
2 不用复杂正 ...

其实我也很懒,我对自己的要求是尽量把shell里面的sed和gawk这两个弄透彻些,毕竟以后肯定还是用得着。至于shell里面的各种嵌套循环我都是以理解读通书上讲解的例子来要求自己的,并不想做更深层次的学习,主要的脚本还是打算用Python去写。等这本书啃完了就去啃Python基础教程了,这也是为啥我读这本编程大全只花了不到一周就快读完的原因

论坛徽章:
1
15-16赛季CBA联赛之江苏
日期:2016-10-26 16:19:04
8 [报告]
发表于 2017-02-07 14:44 |只看该作者
回复 4# lorihuang
当然能匹配上,因为?代表的意思是前面的字符出现0此或者是一次,只要是前面的sat能匹配上,所以后就会输出,后面
括号里面的东西,前面的字符一个都不匹配或者是出现一次都是可以匹配成功的。

论坛徽章:
0
9 [报告]
发表于 2017-02-07 14:56 |只看该作者
fh21_xuejinlian 发表于 2017-02-07 14:44
回复 4# lorihuang
当然能匹配上,因为?代表的意思是前面的字符出现0此或者是一次,只要是前面的sat能匹 ...

在这里我是不是可以理解为把/sat(urday)?/和 /sat/划等号了?

论坛徽章:
0
10 [报告]
发表于 2017-02-07 15:07 |只看该作者
回复 8# fh21_xuejinlian

感谢,我现在是有点通透的感觉了,因为()内的字符串是以单个字符来看待。以/sat(urday)/等同/sat/为前提,我紧接着测试了几个命令:echo "saty" |gawk '/sat(urda)?y/{print $0}'能匹配而echo "sat1y" |gawk '/sat(urda)?y/{print $0}'不能匹配,这就是之前我问的那个bt和bot是一模一样了,现在输出结果和我想象中的一样了!真的很谢谢你的耐心回复!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP