2012-08-08 65 views
2

我有格式文件:打印多個REG EXPR在相同的字符串匹配的Perl

20120807 175041.438 5976.022 E 27000 [PRE:4712345678: Just some text HERE '127.0.0.1' or APU_ID '' - DEFAULTING TO WORLD_PLAN_9 ZONE] 
20120807 175041.438 5976.022 E 27000 [PRE:4722345679: Just some text HERE '127.0.0.2' or APU_ID '26002' - DEFAULTING TO WORLD_PLAN_9 ZONE] 
.. 

我想提取的是:

20120807;4712345678;127.0.0.1;; 
20120807;4722345679;127.0.0.2;26002; 

我知道我可以通過提取IP地址例如。 /(\d+\.){3}\d+/和10個數字以4開頭,例如: /[4][0-9]{9}/但如何從相同的字符串一起打印它們?

回答

1
while (<DATA>) { 
    @ds = /^(\d+).*?PRE:(\d+):[^']+'([^']+)' or APU_ID '(\d*)'/; 
    print "$_;" for @ds; 
    print "\n"; 
} 

__DATA__ 
20120807 175041.438 5976.022 E 27000 [PRE:4712345678: Just some text HERE '127.0.0.1' or APU_ID '' - DEFAULTING TO WORLD_PLAN_9 ZONE] 
20120807 175041.438 5976.022 E 27000 [PRE:4722345679: Just some text HERE '127.0.0.2' or APU_ID '26002' - DEFAULTING TO WORLD_PLAN_9 ZONE] 

輸出:

20120807;4712345678;127.0.0.1;; 
20120807;4722345679;127.0.0.2;26002; 
0
use strict; 

while(my $line = <DATA>) { 

    $line =~ m{ 
      ^
      (\d+)    # first number 
      .*? 
      (\d{10})   # 10 digits number 
      .*? 
      ((?:\d+\.){3}\d+) # ip 
      .*? 
      APU_ID\s' 
      (\d*)    # apu number 
      ' 
    }x; 

    printf "%s %s %s %s\n", $1, $2, $3, $4; 
} 

__DATA__ 
20120807 175041.438 5976.022 E 27000 [PRE:4712345678: Just some text HERE '127.0.0.1'  or APU_ID '' - DEFAULTING TO WORLD_PLAN_9 ZONE] 
20120807 175041.438 5976.022 E 27000 [PRE:4722345679: Just some text HERE '127.0.0.2' or APU_ID '26002' - DEFAULTING TO WORLD_PLAN_9 ZONE]