免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 24947 | 回复: 11

grep -Po 非贪婪匹配问题 [复制链接]

论坛徽章:
1
双子座
日期:2013-10-17 00:46:45
发表于 2011-10-16 14:42 |显示全部楼层
本帖最后由 xrzs1986 于 2011-10-16 16:19 编辑
  1. gs_decli_0_231:~ # echo 12,23,24|grep -Po '([0-9]\d{1,})?'
  2. 12
  3. gs_decli_0_231:~ # echo 12,23,24|grep -Po '([0-9]\d{1,})'
  4. 12
  5. 23
  6. 24
  7. gs_decli_0_231:~ #
复制代码
上面的 ? 能起到分贪婪匹配的作用,但下面的就不行了:
  1. gs_decli_0_231:~ # echo "2011-10-15 00:00:00,123,186027123456,0,176027123456"|grep -Po '([1-9]\d{4,})?'
  2. gs_decli_0_231:~ #
复制代码
其实我的想法就是 2011-10-15 00:00:00,123,186027123456,0,176027123456 中
我 grep -Po 到第一个 5 位数以上的数字就算成功,返回给我即可,比如本例中将返回 186027123456

PS,这里我只想用 grep -Po的方式,解答的时候请围绕这个展开,不用sed、awk、cut。。。

thx~
PS:刚掉了个条件,真不好意思啊。。。见标红部分:
grep -Po 到第一个 5 位数以上的数字就算成功

论坛徽章:
0
发表于 2011-10-16 15:30 |显示全部楼层
grep  -oP '^\d+'

论坛徽章:
1
摩羯座
日期:2014-12-29 15:59:36
发表于 2011-10-16 15:44 |显示全部楼层

-m, --max-count=NUM

论坛徽章:
1
双子座
日期:2013-10-17 00:46:45
发表于 2011-10-16 16:17 |显示全部楼层
回复 2# justlooks


    不好意思,刚少了个条件:grep -Po 到第一个 5 位数以上的数字

论坛徽章:
1
双子座
日期:2013-10-17 00:46:45
发表于 2011-10-16 16:25 |显示全部楼层
回复 3# ziyunfei

额 ,云飞兄,你这个 -m 并不能满足我的需求,我要的是行内匹配到一次就返回值,因此我才想到用非贪婪来解决的,
-m n是用于多行匹配下,只返回匹配的n行作为结果:
gs_decli_0_231:~ # echo "12
> 23"|grep -m 1 '2'
12
gs_decli_0_231:~ #

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
发表于 2011-10-16 21:48 |显示全部楼层
回复 1# xrzs1986

$ echo "2011-10-15 00:00:00,123,186027123456,0,176027123456,"|grep -Po '\d{5,}(?=,.+)'
186027123456

论坛徽章:
1
双子座
日期:2013-10-17 00:46:45
发表于 2011-10-16 22:56 |显示全部楼层
回复 6# jason680


    en, 就我举的例子来说可以,但对文本格式太过依赖,如:echo "2011-10-15 00:00:00,123,186027123456,0,176027123456,166027123456" 就不行了。
看来单纯的依靠正则的非贪婪并不能达到效果,grep -Po还和grep的版本有关,现在我在另一版本下测试,括号外的?没有非贪婪的效果了:
echo 12,23,24|grep -Po '([0-9]\d{1,})?'
12
23
24
june@~ 22:51:30>
echo 12,23,24|grep -Po '([0-9]\d{1,})'
12
23
24
june@~ 22:51:40>

注:非贪婪只对量词有效果,如 * + {1,9} 等

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
发表于 2011-10-16 23:30 |显示全部楼层
本帖最后由 jason680 于 2011-10-16 23:34 编辑

回复 7# xrzs1986

实在不知你要什么....
如果只能是grep ...要其他条件...

$ echo "2011-10-15 00:00:00,123,186027123456,0,176027123456,166027123456" | grep -Po '\d{5,}' | grep -m 1 .
186027123456

$ echo "2011-10-15 00:00:00,123,186027123456,0,176027123456,166027123456" | grep -Po '(?<=:\d{2},\d{3},)\d{5,}'
186027123456

$ echo "2011-10-15 00:00:00,123,186027123456,0,176027123456,166027123456" | grep -Po '\d{5,}(?=,0)'
186027123456

$ echo "2011-10-15 00:00:00,123,186027123456,0,176027123456,166027123456" | grep -Po '\d{5,}(?=,\d)'
186027123456
176027123456

如果只是一个command,那多的是....
$ echo "2011-10-15 00:00:00,123,186027123456,0,176027123456,166027123456" | awk -F, '{for(n=1;n++<NFif($n>=10000){print $n;exit}}'
186027123456

$ echo "2011-10-15 00:00:00,123,186027123456,0,176027123456,166027123456" | perl -F, -lane '{for(@F){if($_>=10000){print;exit}}}'
186027123456

论坛徽章:
1
双子座
日期:2013-10-17 00:46:45
发表于 2011-10-17 00:48 |显示全部楼层
本帖最后由 xrzs1986 于 2011-10-17 00:51 编辑

回复 8# jason680

恩,多谢 jason680 的回复。
其实我发帖的目的是想在本例中探讨 正则的非贪婪(grep -Po ?) 究竟能不能实现 匹配一次就返回结果的效果,并不局限于求答案,呵呵。
因此,我一开始就限定了不用sed、awk来实现,因为按域分割来解决太容易了。
一开始我就因为在某个版本的grep中把我引入歧途了,一直以为grep的非贪婪可以实现匹配一次就返回,后来仔细想想非贪婪只对量词有效,对括号是没用的。
看下面同样两条语句,在不同grep版本下,结果截然不同:
gs_decli_0_231:~ # echo 12,23,24|grep -Po '([0-9]\d{1,})?'   #这个误导了我,一直以为?起到了非贪婪的作用,现在看来是版本有BUG。。。
12


june@~ 23:03:40>
echo 12,23,24|grep -Po '([0-9]\d{1,})?'
12
23
24
june@~ 00:50:16>

论坛徽章:
1
摩羯座
日期:2014-12-29 15:59:36
发表于 2011-10-17 09:15 |显示全部楼层
?是{0,1}??才是非贪婪.基础啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP