免费注册 查看新帖 |

Chinaunix

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

一个关于awk之match函数的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-12-11 20:49 |只看该作者 |倒序浏览
awk ' { if(match($0,/[A-Z]+/)) print substr($0,RSTART,RLENGTH)}'  test

其中test的内容如下:
Hello
Welcom
What
Why

我预计的输出结果是每行的首个大写字母,但实际输出却是原先的整个文本。

本来认为是IGNORECASE的原因,但改了也没用。

请问高手问题出在哪里了?

论坛徽章:
0
2 [报告]
发表于 2008-12-11 21:06 |只看该作者
首个大写字母?RLENGTH改成1看看

论坛徽章:
0
3 [报告]
发表于 2008-12-11 21:14 |只看该作者

回复 #2 li2002 的帖子

RELENGTH 改成1的确的对的,但我想知道match匹配时不是应该把RLENGTH置成1么,这里为什么置成整个字符串长度了?

论坛徽章:
0
4 [报告]
发表于 2008-12-11 21:23 |只看该作者
match匹配时RLENGTH置成匹配字符串的长度

match函数返回在字符串中正则表达式位置的索引,如果找不到指定的正则表达式则返回0。match函数会设置内建变量RSTART为字符串中子字符串的开始位置,RLENGTH为到子字符串末尾的字符个数。substr可利于这些变量来截取字符串。函数格式如下:

            match( string, regular expression )

实例:

            $ awk '{start=match("this is a test",/[a-z]+$/); print start}'
            $ awk '{start=match("this is a test",/[a-z]+$/); print start, RSTART, RLENGTH }'

第一个实例打印以连续小写字符结尾的开始位置,这里是11。

第二个实例还打印RSTART和RLENGTH变量,这里是11(start),11(RSTART),4(RLENGTH)。

论坛徽章:
0
5 [报告]
发表于 2008-12-11 21:43 |只看该作者

回复 #4 li2002 的帖子

首先谢谢你的回答。在你举的例子中RSTART, RLENGTH 都得到了预期的结果,但在我的例子中RLENGTH 的值却不是预期值。
还是用原来的test文件作输入:
awk ' { if(match($0,“/[A-Z]+/”))  print RSTART,RLENGTH } '  test
结果如下:
1 5
1 6
1 2(这一行的结果更令人困惑了!!)
1 3

论坛徽章:
23
15-16赛季CBA联赛之吉林
日期:2017-12-21 16:39:27白羊座
日期:2014-10-27 11:14:37申猴
日期:2014-10-23 08:36:23金牛座
日期:2014-09-30 08:26:49午马
日期:2014-09-29 09:40:16射手座
日期:2014-11-25 08:56:112015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:0315-16赛季CBA联赛之山东
日期:2017-12-21 16:39:1915-16赛季CBA联赛之广东
日期:2016-01-19 13:33:372015亚冠之山东鲁能
日期:2015-10-13 09:39:062015亚冠之西悉尼流浪者
日期:2015-09-21 08:27:57
6 [报告]
发表于 2008-12-12 09:54 |只看该作者

回复 #5 wqfhenanxc 的帖子

版本或者环境问题。

$ cat urfile
Hello
weLCom
whAt
Why
$ awk '{if(match($0,/[A-Z]+/)) print RSTART,RLENGTH}' urfile
1 1
3 2
3 1
1 1
$ awk --version
GNU Awk 3.1.1
Copyright (C) 1989, 1991-2002 Free Software Foundation.

论坛徽章:
8
摩羯座
日期:2014-11-26 18:59:452015亚冠之浦和红钻
日期:2015-06-23 19:10:532015亚冠之西悉尼流浪者
日期:2015-08-21 08:40:5815-16赛季CBA联赛之山东
日期:2016-01-31 18:25:0515-16赛季CBA联赛之四川
日期:2016-02-16 16:08:30程序设计版块每日发帖之星
日期:2016-06-29 06:20:002017金鸡报晓
日期:2017-01-10 15:19:5615-16赛季CBA联赛之佛山
日期:2017-02-27 20:41:19
7 [报告]
发表于 2008-12-12 09:58 |只看该作者
LANG=C awk ' { if(match($0,/[A-Z]+/)) print substr($0,RSTART,RLENGTH)}'  test

论坛徽章:
0
8 [报告]
发表于 2008-12-12 10:11 |只看该作者
确实加LANG=C 就OK了...

论坛徽章:
0
9 [报告]
发表于 2008-12-12 10:13 |只看该作者
是LANG的问题

论坛徽章:
0
10 [报告]
发表于 2008-12-12 14:14 |只看该作者

回复 #7 waker 的帖子

hehe,的确是LANG的问题啊,多谢。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP