免费注册 查看新帖 |

Chinaunix

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

grep下正则表达式问题,点的匹配,求解答 [复制链接]

论坛徽章:
13
午马
日期:2015-01-19 14:08:552017金鸡报晓
日期:2017-01-10 15:13:29黑曼巴
日期:2016-11-07 11:24:56PHP
日期:2016-10-25 16:06:46黄金圣斗士
日期:2015-11-24 10:43:13IT运维版块每日发帖之星
日期:2015-09-25 06:20:00IT运维版块每日发帖之星
日期:2015-09-14 06:20:002015亚冠之阿尔纳斯尔
日期:2015-07-27 11:17:582015亚冠之广州恒大
日期:2015-07-24 15:04:162015年亚洲杯之乌兹别克斯坦
日期:2015-04-01 13:28:012015年辞旧岁徽章
日期:2015-03-03 16:54:15处女座
日期:2015-01-22 16:09:16
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-06-27 16:58 |只看该作者 |倒序浏览
本帖最后由 wsysx 于 2011-06-28 20:43 编辑

我换种问法,比如当前目录有test文件和te.1文件,用ls|grep te.*  只能匹配出来te.1;
创建te.2文件,然后ls|grep te.*,啥也没匹配出来;
此时用ls|grep te..*  则三个文件都能匹配出来,原因?
第一次ls|grep te.* 为啥匹配不出来test?
ubuntu10.04系统,GNU bash, version 4.1.5(1)-release (i486-pc-linux-gnu)。


比如ls|grep tmp.*  和ls|grep tmp..* 能匹配的有什么差别,
感觉后边的能匹配上的前面的都能匹配啊,但是实际操作结果是比如tmp.1234或者plugtmp-1 都只是后边的能匹配出来,前边的匹配不出来。为什么?

论坛徽章:
0
2 [报告]
发表于 2011-06-27 17:13 |只看该作者
按道理是前面的能把两个都匹配出来,而后面的只能匹配tmp.1234

论坛徽章:
0
3 [报告]
发表于 2011-06-27 17:13 |只看该作者
按道理是前面的能把两个都匹配出来,而后面的只能匹配tmp.1234

论坛徽章:
0
4 [报告]
发表于 2011-06-27 17:14 |只看该作者
回复 1# wsysx


    ls|grep tmp.*  和ls|grep tmp..*

tmp.* .*可以0或多个
  tmp..* 一个或多个

论坛徽章:
0
5 [报告]
发表于 2011-06-27 17:17 |只看该作者
tmp.1234 用 ls|grep tmp.* 表达式是可以匹配到的, 它匹配以tmp.开头的所有内容
ls|grep tmp..*匹配包含tmp 三个字符 的所有内容

论坛徽章:
0
6 [报告]
发表于 2011-06-27 17:24 |只看该作者
[root@perass tools]# ls -lt | grep -E tmp\.
-rw-r--r-- 1 root root    0 Jun 26 11:23 tmp11
-rw-r--r-- 1 root root    0 Jun 26 11:22 tmp..
-rw-r--r-- 1 root root    0 Jun 26 11:20 tmp.1111
-rw-r--r-- 1 root root    0 Jun 26 11:20 tmp.1
-rw-r--r-- 1 root root    0 Jun 26 11:20 tmp.111
-rw-r--r-- 1 root root    1 Jun 25 11:27 tmp.log

不准的

论坛徽章:
0
7 [报告]
发表于 2011-06-27 17:26 |只看该作者
[root@perass tools]# ls -lt | awk '{if ($9~/tmp.*/) print $0}'
-rw-r--r-- 1 root root    0 Jun 26 11:23 tmp11
-rw-r--r-- 1 root root    0 Jun 26 11:22 tmp
-rw-r--r-- 1 root root    0 Jun 26 11:22 tmp..
-rw-r--r-- 1 root root    0 Jun 26 11:20 tmp.1111
-rw-r--r-- 1 root root    0 Jun 26 11:20 tmp.1
-rw-r--r-- 1 root root    0 Jun 26 11:20 tmp.111
-rw-r--r-- 1 root root    1 Jun 25 11:27 tmp.log
[root@perass tools]# ls -lt | awk '{if ($9~/tmp..*/) print $0}'
-rw-r--r-- 1 root root    0 Jun 26 11:23 tmp11
-rw-r--r-- 1 root root    0 Jun 26 11:22 tmp..
-rw-r--r-- 1 root root    0 Jun 26 11:20 tmp.1111
-rw-r--r-- 1 root root    0 Jun 26 11:20 tmp.1
-rw-r--r-- 1 root root    0 Jun 26 11:20 tmp.111
-rw-r--r-- 1 root root    1 Jun 25 11:27 tmp.log

tmp.* 表示tmp开头的所有字符窜
tmp..* 表示tmp后跟1个或者多个字符

论坛徽章:
0
8 [报告]
发表于 2011-06-27 17:26 |只看该作者
本帖最后由 lionfun 于 2011-06-27 17:34 编辑

回复 1# wsysx


    “.”在这里被当做RE元字符来用了,匹配一个非换行符的字符,如果要当做内容的话需要(\)来转义,注意为了避免shell的元字符对正则表达式的影响,请用单引号('')括起来。

论坛徽章:
0
9 [报告]
发表于 2011-06-27 17:30 |只看该作者
果真 得加上""
[root@perass tools]# ls -lt | grep -E tmp".*"
-rw-r--r-- 1 root root    0 Jun 26 11:23 tmp11
-rw-r--r-- 1 root root    0 Jun 26 11:22 tmp
-rw-r--r-- 1 root root    0 Jun 26 11:22 tmp..
-rw-r--r-- 1 root root    0 Jun 26 11:20 tmp.1111
-rw-r--r-- 1 root root    0 Jun 26 11:20 tmp.1
-rw-r--r-- 1 root root    0 Jun 26 11:20 tmp.111
-rw-r--r-- 1 root root    1 Jun 25 11:27 tmp.log

论坛徽章:
13
午马
日期:2015-01-19 14:08:552017金鸡报晓
日期:2017-01-10 15:13:29黑曼巴
日期:2016-11-07 11:24:56PHP
日期:2016-10-25 16:06:46黄金圣斗士
日期:2015-11-24 10:43:13IT运维版块每日发帖之星
日期:2015-09-25 06:20:00IT运维版块每日发帖之星
日期:2015-09-14 06:20:002015亚冠之阿尔纳斯尔
日期:2015-07-27 11:17:582015亚冠之广州恒大
日期:2015-07-24 15:04:162015年亚洲杯之乌兹别克斯坦
日期:2015-04-01 13:28:012015年辞旧岁徽章
日期:2015-03-03 16:54:15处女座
日期:2015-01-22 16:09:16
10 [报告]
发表于 2011-06-27 17:45 |只看该作者
我的想法也是被当作通配符来用,而不是点号,但结果跟预期的不同,点是怎么解释的?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP