LINUX 正则表达式用法

本文通过一系列示例详细解析了正则表达式的基本概念及用法,如*号的匹配规则,以及如何利用不同的字符集进行精确匹配。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


背景

一直对正则表达式了解不多,今天又碰到一个奇怪的问题,看如下例子

[root@devserver ~]# echo application |grep k*n
application

想了半天也没明白,在application里面没有字母k,会能匹配呢。发现无论把k替换成任何字母都是会匹配成功的。

随即从百度百科看了仔细用法:

*
匹配前面的子表达式零次或多次。例如,zo*能匹配“z”以及“zoo”。*等价于{0,}。

对例子中的zo*能匹配z仔细体会,终于明白了*号前面的字母任意次。因此在之前的例子中是对的。

深入了解

看下面的执行结果
[root@devserver ~]# echo application | grep a*n
application
[root@devserver ~]# echo application | grep ap*n    //只能匹配 an apn appn appppn
[root@devserver ~]# echo application | grep ap.*n   //这里.表示任意字符,因此.*是可以表示中间的任意字符
application
[root@devserver ~]# echo application | grep app.*n  //同上
application

继续看下去,使用[a-z]替换.*
[root@devserver ~]# echo application | grep a.*n
application
[root@devserver ~]# echo application | grep a[a-z]*n
application
[root@devserver ~]# echo application | grep a[a-z1-9]*n
application
使用:lower:替换.*,也都是可以的
[root@omsdevserver ~]# echo application | grep app[[:lower:]]*n
application
[root@omsdevserver ~]# echo application | grep app[[:upper:]]*n
[root@omsdevserver ~]# echo application | grep app[[:upper:][:lower:]]*n
application


为什么我们会觉得奇怪

日常工作中,用正则表达式是比较少的。但是用shell是比较多的,比如查找文件
[root@omsdevserver ~]# ls in*log
install.log  install.log.syslog
但是我们从来不会用查找install.log文件
[root@omsdevserver ~]# ls ik*log

因此,我们主观认为grep ik*log是不能匹配的
通过查找资料发现,shell中*是指expansion。我们上面用的是最常用的Filename expansion。
After word splitting, unless the -f option has been set (see Section 2.3.2), Bash scans each word for the characters "*", "?", and "[". If one of these characters appears, then the word is regarded as a PATTERN, and replaced with an alphabetically sorted list of file names matching the pattern

在这种情况下,并不是使用正则表达式的规则来进行的,而只是一种PATTERN.



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值