读取特定索引中的行直到perl中的文件末尾

时间:2015-01-08 07:28:34

标签: regex perl

我的日志文件包含以下内容:

(8092) "DEFECT_AUDIT_INTTEST_FRI_JAN_02_2015_07_05_09" (3 of 4)
(7992) ---$ FirstName1 Surname1 "Comment number 1" 02-Jan-2015 01:53 AM
(8007) ---$ FirstName2 Surname2 "Comment number 2" 19-Dec-2014 06:20 AM
(7994) ---$ FirstName3 Surname3 "Comment number 3" 19-Dec-2014 06:46 AM

我想阅读每个文件并存储符合以下标准的内容,即 一个。线有--- 湾内容从---开始,后跟特殊字符$和空格。例如。 这里我想要的数组大小为3并具有以下内容: FirstName1 Surname1"评论编号1" 02-Jan-2015 01:53 AM FirstName2 Surname2"评论编号2" 2014年12月19日上午06:20 FirstName3 Surname3"评论编号3" 2014年12月19日上午06:46 我目前的代码是:

if($_ =~/---$/){
    my ($CsDescription) = /"---$ "/;
    push @CSArray , $CsDescription;
}

2 个答案:

答案 0 :(得分:1)

  

......以下元字符具有[特殊]含义:

\        Quote the next metacharacter
^        Match the beginning of the line
.        Match any character (except newline)
$        Match the end of the string (or before newline at the end
         of the string)
|        Alternation
()       Grouping
[]       Bracketed Character class 

http://perldoc.perl.org/perlre.html

  

括号中的特殊字符类   大多数人物   这是正则表达式中的元字符(即字符   带有特殊含义的。,*或()会失去特殊的意义   意义并且可以在角色类中使用而无需使用   逃避他们。例如,[()]匹配左括号,   或一个右括号,以及字符类中的parens   不要分组或捕获。

     

在角色类中可能具有特殊含义的角色   是:\,^, - ,[和],并在下面讨论。他们可以逃脱   反斜杠,虽然有时不需要,在这种情况下   反斜杠可以省略。

http://perldoc.perl.org/perlrecharclass.html#Bracketed-Character-Classes

use strict;
use warnings;
use 5.016;

my @lines;

my $regex = qr{
    .*?     #Match any character, 0 or more times, non-greedy, followed by...
    -{3}    #a dash, 3 times, followed by...
    \$      #a dollar sign, followed by...
    [ ]     #a space, followed by...
    (.*)    #any character, 0 or more times, captured in $1
}xms;


for my $line (<DATA>) {
    if ($line =~ $regex) {
        push @lines, $1;
    }
}

print for @lines;

__DATA__
(8092) "DEFECT_AUDIT_INTTEST_FRI_JAN_02_2015_07_05_09" (3 of 4)
(7992) ---$ FirstName1 Surname1 "Comment number 1" 02-Jan-2015 01:53 AM
(8007) ---$ FirstName2 Surname2 "Comment number 2" 19-Dec-2014 06:20 AM
(7994) ---$ FirstName3 Surname3 "Comment number 3" 19-Dec-2014 06:46 AM

输出:

FirstName1 Surname1 "Comment number 1" 02-Jan-2015 01:53 AM
FirstName2 Surname2 "Comment number 2" 19-Dec-2014 06:20 AM
FirstName3 Surname3 "Comment number 3" 19-Dec-2014 06:46 AM

大多数在正则表达式中为元字符的字符(即带有特殊含义的字符,如。,*或()会失去其特殊含义,并且可以在字符类中使用而无需转义它们。实例,[()]匹配左括号或右括号,并且字符类中的parens不会分组或捕获。

在字符类中可能带有特殊含义的字符是:\,^, - ,[和],并在下面讨论。它们可以使用反斜杠进行转义,但有时不需要,在这种情况下可以省略反斜杠。

http://perldoc.perl.org/perlrecharclass.html#Bracketed-Character-Classes

什么关于$ ??!

答案 1 :(得分:0)

您可以将$视为文字,因为您使用$ perl作为行尾 并删除内容,直到找到$符号

if(/---\$/){
    my $CsDescription=$_;                                                    
    $CsDescription =~s/.*\$// ;
    push @CSArray , $CsDescription;
}


print "@CSArray" ;

输出

FirstName1 Surname1 "Comment number 1" 02-Jan-2015 01:53 AM
FirstName2 Surname2 "Comment number 2" 19-Dec-2014 06:20 AM
FirstName3 Surname3 "Comment number 3" 19-Dec-2014 06:46 AM