免费注册 查看新帖 |

Chinaunix

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

perl循环多行匹配问题请教 [复制链接]

论坛徽章:
1
程序设计版块每日发帖之星
日期:2015-07-08 22:20:00
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-07-06 16:10 |只看该作者 |正序浏览
我有一个包含几万行的log1文件,部分内容如下:

.......................
2015-7-6 15:30:06  BS7546152075910633343435A
2015-7-6 15:30:08  CAB753715207511043333333326
.......................
2015-7-6 15:30:16  CAB754615207511043333333321
.......................
2015-7-6 15:31:20  BS7538152075910633343435B
.......................
2015-7-6 15:31:31  CS7538152075110433333333B8
.......................

这些内容之间还包括了很多行
如果要打印出包含字符串"75(\d{6})75910633343435"的行和包含$1的行并保存到log2文件中,如这部分内容我要得到的行是:
2015-7-6 15:30:06  BS7546152075910633343435A
2015-7-6 15:30:16  CB754615207511043333333321
2015-7-6 15:31:20  BS7538152075910633343435B
2015-7-6 15:31:31  CS7538152075110433333333B8

用perl脚本怎么实现呢?


我刚开始是想着一步一步来,先实现打印出$1,程序如下:
use strict;
open(MYFILE,"E:/log1.txt") or die("Can't open log1.txt");
$/ = undef;
while(my $values1 = <MYFILE>){
    if($values1 =~ /75(\d{6})75910633343435/){
        print $1;
    }     
}
close MYFILE;

但得到的只有一个值:461520,我本来想得到的结果是
461520
381520

因为还在初学阶段,我是想着一步一步来,先实现打印出$1,再实现包含$1的行,不过研究了很久第一步还没有实现。小妹是初学perl,请大家多多指教,谢谢!

论坛徽章:
10
2015亚冠之广州富力
日期:2015-06-16 14:44:332015亚冠之西悉尼流浪者
日期:2015-08-19 13:14:352015亚冠之阿尔希拉尔
日期:2015-08-04 09:38:052015亚冠之萨济拖拉机
日期:2015-07-31 15:01:582015亚冠之首尔
日期:2015-07-27 14:24:312015亚冠之塔什干火车头
日期:2015-07-20 09:47:202015亚冠之布里斯班狮吼
日期:2015-07-15 14:58:432015亚冠之首尔
日期:2015-07-07 09:31:262015亚冠之广州恒大
日期:2015-07-06 15:41:272015亚冠之首尔
日期:2015-08-27 11:03:01
32 [报告]
发表于 2015-07-10 11:30 |只看该作者
回复 31# yilongyansha


    匹配上的$a push到一个数组里面去,然后foreach这个新数组。

论坛徽章:
1
程序设计版块每日发帖之星
日期:2015-07-08 22:20:00
31 [报告]
发表于 2015-07-10 09:54 |只看该作者
回复 22# xiaoxingan99

你好,我按照你的程序运行后,发现第二次读取文件也是读取整个文件吧,我现在是想先匹配正则为:75(\d{6})75910633343435 的行,再在这一行后面的文件行中匹配包含 $1 的行,而第一次匹配之前的行就不考虑了,这该如何实现呢?谢谢


   

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
30 [报告]
发表于 2015-07-09 00:02 |只看该作者
本帖最后由 MMMIX 于 2015-07-09 00:03 编辑

回复 1# yilongyansha


    假设所有模式是顺序出现的,找到需要的模式就循环直到下一个新模式出现:

  1. OUTER:
  2. while (<>) {
  3.         if (m/75(\d{6})75910633343435/) {
  4.                 print;
  5.                 $last_pat = $1;
  6.                 while (<>) {
  7.                         m/$last_pat/ ? print : redo OUTER;
  8.                 }
  9.                 last OUTER;
  10.         } elsif (defined $last_pat and m/$last_pat/) {
  11.                 print;
  12.         }
  13. }
复制代码

论坛徽章:
1
程序设计版块每日发帖之星
日期:2015-07-08 22:20:00
29 [报告]
发表于 2015-07-07 14:59 |只看该作者
回复 22# xiaoxingan99

谢谢。结果存放在文件中这个功能实现了,前面的我再试一下


   

论坛徽章:
10
2015亚冠之广州富力
日期:2015-06-16 14:44:332015亚冠之西悉尼流浪者
日期:2015-08-19 13:14:352015亚冠之阿尔希拉尔
日期:2015-08-04 09:38:052015亚冠之萨济拖拉机
日期:2015-07-31 15:01:582015亚冠之首尔
日期:2015-07-27 14:24:312015亚冠之塔什干火车头
日期:2015-07-20 09:47:202015亚冠之布里斯班狮吼
日期:2015-07-15 14:58:432015亚冠之首尔
日期:2015-07-07 09:31:262015亚冠之广州恒大
日期:2015-07-06 15:41:272015亚冠之首尔
日期:2015-08-27 11:03:01
28 [报告]
发表于 2015-07-07 14:59 |只看该作者
回复 27# yilongyansha


    1. 可以直接用命令行
    perl e:\test2.pl >>c:\log.txt
    2. 用perl的文件句柄
open A, ">>c:/log.txt";

print A $a; #$a是你想要输出的东西

论坛徽章:
1
程序设计版块每日发帖之星
日期:2015-07-08 22:20:00
27 [报告]
发表于 2015-07-07 14:22 |只看该作者
回复 22# xiaoxingan99

另外,怎样把输出的结果存放在另一个.txt文件中呢,方便我查看结果


   

论坛徽章:
1
程序设计版块每日发帖之星
日期:2015-07-08 22:20:00
26 [报告]
发表于 2015-07-07 14:18 |只看该作者
回复 22# xiaoxingan99

好,我试一下

只要是符合条件的,不管重不重复都要输出,而且重复的也不用删除


   

论坛徽章:
26
2015亚冠之胡齐斯坦钢铁
日期:2015-06-25 21:40:202015亚冠之柏斯波利斯
日期:2015-08-31 17:03:192015亚冠之柏斯波利斯
日期:2015-11-07 13:10:00程序设计版块每日发帖之星
日期:2015-11-10 06:20:00每日论坛发贴之星
日期:2015-11-10 06:20:00程序设计版块每日发帖之星
日期:2015-11-26 06:20:00程序设计版块每日发帖之星
日期:2015-12-02 06:20:00黄金圣斗士
日期:2015-12-07 17:57:4615-16赛季CBA联赛之天津
日期:2015-12-23 18:34:14程序设计版块每日发帖之星
日期:2016-01-02 06:20:00程序设计版块每日发帖之星
日期:2016-01-06 06:20:00每日论坛发贴之星
日期:2016-01-06 06:20:00
25 [报告]
发表于 2015-07-07 14:17 |只看该作者
回复 24# yilongyansha


delete

    next if '.' eq substr $_, 0, 1;

论坛徽章:
1
程序设计版块每日发帖之星
日期:2015-07-08 22:20:00
24 [报告]
发表于 2015-07-07 14:14 |只看该作者
本帖最后由 yilongyansha 于 2015-07-07 14:14 编辑

回复 23# substr函数

我的问题,我没说清楚
中间一连串的........是代表有很多类似的行,不是"."字符,我的文件中没有特殊符号,只有空格和换行符


   
  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP