bash shell 无法使用 perl 正则
![](/theme/default/default/images/main/eye-open.png)
我们非常重视原创文章,为尊重知识产权并避免潜在的版权问题,我们在此提供文章的摘要供您初步了解。如果您想要查阅更为详尽的内容,访问作者的公众号页面获取完整文章。
![](/theme/default/default/images/main/icon-jing.png)
咸鱼在本文中分享了一个关于正则表达式的案例,并就其中出现的问题进行了分析和解决。案例中,一位小伙伴的shell脚本因为正则表达式问题无法正确匹配文本文件内容。脚本尝试匹配格式为“[数字] 文本内容”的行,但实际执行时并没有匹配到任何内容。
问题的关键在于正则表达式的标准。正则表达式是一种描述文本规律的工具,起源于20世纪40年代的神经网络研究。Unix之父Ken Thompson将其引入到文本编辑与搜索工具,并逐渐普及。由于历史的发展,正则表达式分为POSIX流派和PCRE流派两种。
POSIX流派起源于上个世纪80年代,提供了基本正则表达式(BRE)和扩展正则表达式(ERE)两种标准。BRE功能较弱,不支持一些特殊符号,而ERE则弥补了这些不足。GNU套件在实现POSIX时对其进行了扩展,增加了一些特殊含义的字符表示。
相较之下,PCRE流派源自Perl语言,被许多现代编程语言和工具采纳,特点是提供了如\d、\w、\s等简写字符组。在Unix/Linux系统中,许多工具如grep、sed、awk等遵循POSIX标准,而Linux的bash则基于POSIX标准,不直接支持PCRE。
回到案例问题,脚本中的正则表达式使用了PCRE流派的\d表示数字,而Linux Bash不支持PCRE标准,导致匹配失败。解决方法是将脚本中的正则表达式从PCRE标准改成ERE标准,并使用grep命令的-P参数支持PCRE标准进行匹配,从而成功解决问题。
最后,咸鱼附上了相关的参考链接,并鼓励读者通过[一键三连]来支持作者。
想要了解更多内容?
![](/theme/default/default/images/main/icon-jing.png)
![](https://cdn.easycorp.cn/rongpm/upload/202312/f_39217d624bb2b42ce8f6322ebd7e573a.png)
![](https://cdn.easycorp.cn/rongpm/upload/202312/f_39217d624bb2b42ce8f6322ebd7e573a.png)