免费注册 查看新帖 |

Chinaunix

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

[文本处理] 请教用正则表达式查找数字字符串 [复制链接]

论坛徽章:
18
辰龙
日期:2014-05-21 21:01:4115-16赛季CBA联赛之深圳
日期:2016-12-23 13:51:3815-16赛季CBA联赛之北控
日期:2016-11-28 18:26:3815-16赛季CBA联赛之佛山
日期:2016-11-03 11:18:5815-16赛季CBA联赛之辽宁
日期:2016-07-10 16:09:4115-16赛季CBA联赛之江苏
日期:2016-02-20 23:09:202015亚冠之塔什干棉农
日期:2015-08-17 19:49:492015年亚洲杯之日本
日期:2015-04-30 01:24:342015年亚洲杯之约旦
日期:2015-04-01 00:37:182015年亚洲杯之沙特阿拉伯
日期:2015-03-02 15:55:40处女座
日期:2014-05-25 10:34:0020周年集字徽章-年
日期:2023-04-23 11:17:52
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-05-13 17:50 |只看该作者 |倒序浏览
大家好!
我有一个问题向大家请教。
在文本文件/etc/motd中有一串数字字符串,其结构是:
前面1个数字,中间一个减号,后面7个数字。
例如:
1-5702630
整个文本如下:
  1. Oracle Corporation      SunOS 5.10      Generic Patch   January 2005
  2. Customer DB restored for AR 1-5702630:
  3. Traps for hardware Anomoly errors (pchip memory, xplerror etc) from TiMOS8.0 to SAM10.0 are not resulting in alarms.
复制代码
我想从文本中找到这个数字,应该怎么办呢?
我对正则表达式还是不太熟悉,看了规则,但是怎么试都试不出来。
  1. [root@dhp2:/]# grep '(\d)-(\d){7}' /etc/motd
  2. [root@dhp2:/]# grep "\\d+[-]+\\d{7}" /etc/motd
  3. [root@dhp2:/]# grep "\\d[-]\\d{7}" /etc/motd
  4. [root@dhp2:/]# grep "\\d-\\d{7}" /etc/motd
  5. [root@dhp2:/]# grep "(\\d-)\\d{7}" /etc/motd
  6. [root@dhp2:/]# grep "(\\d{1}-)\\d{7}" /etc/motd
  7. [root@dhp2:/]# grep "([1-9]{1}-)[0-9]{7}" /etc/motd
  8. [root@dhp2:/]# grep "([1-9]{1}-)[0-9]{7}" /etc/motd
  9. [root@dhp2:/]# grep "[1-9]{1}-[0-9]{7}" /etc/motd
  10. [root@dhp2:/]# grep "[1-9]{1}\-[0-9]{7}" /etc/motd
  11. [root@dhp2:/]# grep "[1-9]{1}+(\-[0-9]{7})" /etc/motd
复制代码
请各位高手指点一下。
谢谢了。

论坛徽章:
10
天蝎座
日期:2013-09-22 22:32:23程序设计版块每日发帖之星
日期:2016-08-07 06:20:00lufei
日期:2016-06-17 17:38:40程序设计版块每日发帖之星
日期:2016-06-12 06:20:002016科比退役纪念章
日期:2016-05-31 15:47:20CU十四周年纪念徽章
日期:2016-05-27 12:24:562015年亚洲杯之阿曼
日期:2015-05-03 21:01:352015年辞旧岁徽章
日期:2015-03-03 16:54:15天蝎座
日期:2013-10-20 21:05:24程序设计版块每日发帖之星
日期:2016-08-11 06:20:00
2 [报告]
发表于 2015-05-13 17:55 |只看该作者
  1. grep -oP '[0-9]-[0-9]{7}(?![0-9])'
  2. 1-5702630
复制代码
回复 1# bikkuri


   

论坛徽章:
10
2015年亚洲杯之科威特
日期:2015-04-13 13:51:5315-16赛季CBA联赛之山东
日期:2016-01-16 18:35:0815-16赛季CBA联赛之广东
日期:2016-01-04 15:26:23程序设计版块每日发帖之星
日期:2015-11-13 06:20:002015亚冠之阿尔艾因
日期:2015-11-10 12:32:242015亚冠之阿尔沙巴布
日期:2015-05-15 18:26:49羊年新春福章
日期:2015-04-28 16:45:112015年亚洲杯之伊拉克
日期:2015-04-25 20:06:30羊年新春福章
日期:2015-04-13 13:53:2015-16赛季CBA联赛之八一
日期:2016-01-20 18:23:49
3 [报告]
发表于 2015-05-13 17:56 |只看该作者
  1. awk -F' |:'  '{for(i=0;i++<NF;)if($i~/[0-9]-/)print $i}'
复制代码

论坛徽章:
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
4 [报告]
发表于 2015-05-13 17:56 |只看该作者
回复 1# bikkuri

$ grep -woP '\d-\d{7}' FILE
1-5702630

$ grep -woE '[0-9]-[0-9]{7}' FILE
1-5702630

   

论坛徽章:
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
5 [报告]
发表于 2015-05-13 17:56 |只看该作者
回复 1# bikkuri


$ grep -o '[0-9]-[0-9]\{7\}' file
1-5702630
$ grep -Eo '[0-9]-[0-9]{7}' file
1-5702630
$ grep -Po '\d-\d{7}' file
1-5702630

弄清楚:基本正则、拓展正则、perl 正则的区别。

论坛徽章:
18
辰龙
日期:2014-05-21 21:01:4115-16赛季CBA联赛之深圳
日期:2016-12-23 13:51:3815-16赛季CBA联赛之北控
日期:2016-11-28 18:26:3815-16赛季CBA联赛之佛山
日期:2016-11-03 11:18:5815-16赛季CBA联赛之辽宁
日期:2016-07-10 16:09:4115-16赛季CBA联赛之江苏
日期:2016-02-20 23:09:202015亚冠之塔什干棉农
日期:2015-08-17 19:49:492015年亚洲杯之日本
日期:2015-04-30 01:24:342015年亚洲杯之约旦
日期:2015-04-01 00:37:182015年亚洲杯之沙特阿拉伯
日期:2015-03-02 15:55:40处女座
日期:2014-05-25 10:34:0020周年集字徽章-年
日期:2023-04-23 11:17:52
6 [报告]
发表于 2015-05-13 18:02 |只看该作者
本帖最后由 bikkuri 于 2015-05-13 18:10 编辑

非常感谢您的回复!
不过您的命令在Solaris系统上不能正常运行。
  1. [root@cat4:/]# grep -oP '[0-9]-[0-9]{7}(?![0-9])'
  2. grep: illegal option -- o
  3. grep: illegal option -- P
  4. Usage: grep -hblcnsviw pattern file . . .
复制代码
而且根据Solaris下grep的语法,我看到有一个-c参数可以得到匹配模式的次数:
  1.      -c    Prints only a count of the lines that contain the pat-
  2.            tern.
复制代码
但我用这个参数发现用这个模式匹配到的次数为0?是不是Solaris下的正则表达式和Linux下不一样?
  1. [root@cat4:/]# grep -c '[0-9]-[0-9]{7}(?![0-9])' /etc/motd
  2. 0
复制代码
不过奇怪的是,在Linux下可以得到数字字符串,但是匹配次数显示也是0?
  1. [root@shp4:~]# grep -c '[0-9]-[0-9]{7}(?![0-9])' /etc/motd
  2. 0
  3. [root@shp4:~]# grep -oP '[0-9]-[0-9]{7}(?![0-9])' /etc/motd
  4. 1-5557691
复制代码
有没有在Linux和Solaris下都可以通用的命令呢?
谢谢!

liion631818 发表于 2015-05-13 17:55
回复 1# bikkuri

论坛徽章:
18
辰龙
日期:2014-05-21 21:01:4115-16赛季CBA联赛之深圳
日期:2016-12-23 13:51:3815-16赛季CBA联赛之北控
日期:2016-11-28 18:26:3815-16赛季CBA联赛之佛山
日期:2016-11-03 11:18:5815-16赛季CBA联赛之辽宁
日期:2016-07-10 16:09:4115-16赛季CBA联赛之江苏
日期:2016-02-20 23:09:202015亚冠之塔什干棉农
日期:2015-08-17 19:49:492015年亚洲杯之日本
日期:2015-04-30 01:24:342015年亚洲杯之约旦
日期:2015-04-01 00:37:182015年亚洲杯之沙特阿拉伯
日期:2015-03-02 15:55:40处女座
日期:2014-05-25 10:34:0020周年集字徽章-年
日期:2023-04-23 11:17:52
7 [报告]
发表于 2015-05-13 18:17 |只看该作者
谢谢您的回复。
不过因为这个文本中除了这个数字字符串是有格式的,其他内容都是没有格式的,所以不能用任何分隔符来定位。
例如这是另外一个文本:
  1. Oracle Corporation      SunOS 5.10      Generic Patch   January 2005

  2. Brunei customer SAM9.0R8(upgraded to SAM11.0R7) is restored on the machine for AR:1-5564861.
复制代码
如果用您的命令可以得到:
  1. [root@cat1:/]# cat /etc/motd|awk -F' |:'  '{for(i=0;i++<NF;)if($i~/[0-9]-/)print $i}'
  2. AR:1-5564861.
  3. [root@cat1:/]#
复制代码
当然这很接近正确答案,但是我希望得到的只是数字字符串1-5564861。

drakness 发表于 2015-05-13 17:56

论坛徽章:
18
辰龙
日期:2014-05-21 21:01:4115-16赛季CBA联赛之深圳
日期:2016-12-23 13:51:3815-16赛季CBA联赛之北控
日期:2016-11-28 18:26:3815-16赛季CBA联赛之佛山
日期:2016-11-03 11:18:5815-16赛季CBA联赛之辽宁
日期:2016-07-10 16:09:4115-16赛季CBA联赛之江苏
日期:2016-02-20 23:09:202015亚冠之塔什干棉农
日期:2015-08-17 19:49:492015年亚洲杯之日本
日期:2015-04-30 01:24:342015年亚洲杯之约旦
日期:2015-04-01 00:37:182015年亚洲杯之沙特阿拉伯
日期:2015-03-02 15:55:40处女座
日期:2014-05-25 10:34:0020周年集字徽章-年
日期:2023-04-23 11:17:52
8 [报告]
发表于 2015-05-13 18:22 |只看该作者
本帖最后由 bikkuri 于 2015-05-13 18:27 编辑

谢谢您的指点!
原来是这样的区别。学习了。
但是您的命令在Linux下可以用,在Solaris下也还是不能用。
  1. [root@cat1:/]# grep -E '[0-9]-[0-9]{7}' /etc/motd
  2. grep: illegal option -- E
  3. Usage: grep -hblcnsviw pattern file . . .
  4. [root@cat1:/]# egrep '[0-9]-[0-9]{7}' /etc/motd
  5. [root@cat1:/]#
复制代码
有没有办法在Solaris下也可以通用呢?

回复 5# ly5066113


   

论坛徽章:
18
辰龙
日期:2014-05-21 21:01:4115-16赛季CBA联赛之深圳
日期:2016-12-23 13:51:3815-16赛季CBA联赛之北控
日期:2016-11-28 18:26:3815-16赛季CBA联赛之佛山
日期:2016-11-03 11:18:5815-16赛季CBA联赛之辽宁
日期:2016-07-10 16:09:4115-16赛季CBA联赛之江苏
日期:2016-02-20 23:09:202015亚冠之塔什干棉农
日期:2015-08-17 19:49:492015年亚洲杯之日本
日期:2015-04-30 01:24:342015年亚洲杯之约旦
日期:2015-04-01 00:37:182015年亚洲杯之沙特阿拉伯
日期:2015-03-02 15:55:40处女座
日期:2014-05-25 10:34:0020周年集字徽章-年
日期:2023-04-23 11:17:52
9 [报告]
发表于 2015-05-13 18:22 |只看该作者
本帖最后由 bikkuri 于 2015-05-13 18:28 编辑

谢谢jason680大神的指点。
但是您的命令在Linux下可以用,在Solaris下也还是不能用。
  1. [root@cat1:/]# grep -woP '\d-\d{7}' /etc/motd
  2. grep: illegal option -- o
  3. grep: illegal option -- P
  4. Usage: grep -hblcnsviw pattern file . . .
  5. [root@cat1:/]# grep -woE '[0-9]-[0-9]{7}' /etc/motd
  6. grep: illegal option -- o
  7. grep: illegal option -- E
  8. Usage: grep -hblcnsviw pattern file . . .
  9. [root@cat1:/]#
复制代码
有没有办法在Solaris下也可以通用呢?

回复 4# jason680


   

论坛徽章:
33
ChinaUnix元老
日期:2015-02-02 08:55:39CU十四周年纪念徽章
日期:2019-08-20 08:30:3720周年集字徽章-周	
日期:2020-10-28 14:13:3020周年集字徽章-20	
日期:2020-10-28 14:04:3019周年集字徽章-CU
日期:2019-09-08 23:26:2519周年集字徽章-19
日期:2019-08-27 13:31:262016科比退役纪念章
日期:2022-04-24 14:33:24
10 [报告]
发表于 2015-05-13 18:57 |只看该作者
Solaris请使用 /usr/xpg4/bin/grep
如果还是不行,请自己安装一个GNU的grep
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP