在perl中解析文本文件

时间:2014-05-26 09:31:35

标签: perl

我有一个文本文件如下。 我需要找到关键字"(数字)测试从(数字)测试用例运行"并存储号码。 在下面的例子中,数字是67。 其次,我需要找到" PASSED"关键字,然后是"(数字)测试"。 在下面的例子中,它是67次测试。我该怎么做。

坦克, 沙拉斯

< 0x00000: 5b 2d 2d 2d  2d 2d 2d 2d  2d 2d 2d 5d  20 31 34 20  [----------] 14 
< 0x00010: 74 65 73 74  73 20 66 72  6f 6d 20 44  49 53 41 42  tests from DISAB
< 0x00020: 4c 45 44 5f  47 65 6e 65  72 69 63 44  52 4d 54 65  LED_GenericDRMTe
< 0x00030: 73 74 20 28  31 32 38 34  39 20 6d 73  20 74 6f 74  st (12849 ms tot
< 0x00040: 61 6c 29 0d  0a 0d 0a 5b  2d 2d 2d 2d  2d 2d 2d 2d  al)....[--------
< 0x00050: 2d 2d 5d 20  47 6c 6f 62  61 6c 20 74  65 73 74 20  --] Global test 
< 0x00060: 65 6e 76 69  72 6f 6e 6d  65 6e 74 20  74 65 61 72  environment tear
< 0x00070: 2d 64 6f 77  6e 0d 0a 5b  3d 3d 3d 3d  3d 3d 3d 3d  -down..[========
< 0x00080: 3d 3d 5d 20  36 37 20 74  65 73 74 73  20 66 72 6f  ==] 67 tests fro
< 0x00090: 6d 20 34 20  74 65 73 74  20 63 61 73  65 73 20 72  m 4 test cases r
< 0x000a0: 61 6e 2e 20  28 34 33 38  32 33 20 6d  73 20 74 6f  an. (43823 ms to
< 0x000b0: 74 61 6c 29  0d 0a 5b 20  20 50 41 53  53 45 44 20  tal)..[  PASSED 
< 0x000c0: 20 5d 20 36  37 20 74 65  73 74 73 2e  0d 0a         ] 67 tests...

我尝试了以下代码,但它不匹配:

open (FILE, '<', 'board_dumplog.log')
    or die "Could not open board_dumplog.log: $!";

while (<FILE>) {
    #print $_ if (/^[==========]/ .. /^tests.../);
    if (/^[==========]/ .. /^tests.../) {
        print "Line Found:".$_."\n";
    }
}

close (FILE)
    or die "Could not close board_dumplog.log: $!";

我尝试用下面的一次拍摄,但没有运气。

open (FILE, '<', '123.log') or die "Could not 123.log: $!";
my $i=0;
while (<FILE>) {

   #print $_ if (/^[==========]/ .. /^tests./);
   if (/^[0-9] tests from [0-9] test cases ran/ .. /^[0-9] tests\./){
        print "$i.Match Found:".$_."\n";
        $i++;
   }
}

任何帮助?

2 个答案:

答案 0 :(得分:0)

你需要正确地转义特殊字符,或者你应该在regexp中使用/ Q / E修饰符来匹配。

 if (/^\[[\=]+\]\s*(\d+)\s*tests/i) {
   print "found $1 tests in line: $_\n";

答案 1 :(得分:0)

如果要匹配正则表达式中的文字字符串,则需要转义正则表达式特殊字符。

您应该了解这些特殊字符是什么,但如果您想要快捷方式,则可以使用quotemeta\Q...\E

if (/^\Q[==========]\E/ .. /^\Qtests...\E/) {

括号[]将不再被视为字符类,句点.将不再是任何字符。