[英]Perl - Parse multi-line data from a file with carriage return and line feed
ParseLog.log:
Bug : 4525: TC1
Scan Summary:
Affected Snap:
Snap data - Important Snap data 5674
Stack data - Important Stack data 5421
Affected Stack:
TestStream1 - Important Stack 6322
No Longer Affected Snap:
None
-------------
open(my $parseLog, '<', 'parseLog.log') or die "Can't open search file: $!";
local $/ = "\r\n" ;
while ( my $line = <$parseLog> )
{
$line =~ s/[\x0A\x0D]//g;
my @bugData = $line =~ /Bug :(.*?):/g;
my @snapData = $line =~ /\bAffected Snap:\b(.*?)\bAffected Stack:\b/sg;
print Dumper @bugData ;
print Dumper(@snapshotData);
}
从 ParseLog.log,我想解析
ParseLog 文件有回车和换行。
我无法使用 chomp 删除它们,所以我使用了$line =~ s/[\\x0A\\x0D]//g;
在此 $line 变为
错误:4525:TC1Scan 摘要:------------受影响的快照:快照数据 - 重要的快照数据 5674 堆栈数据 - 重要的堆栈数据 5421 受影响的堆栈:TestStream1 - 重要的堆栈 6322 不再受影响的快照:无不再受影响的堆栈:无
我能够解析错误编号(错误:4525:TC1)
当我尝试解析“受影响的快照:”时,我得到以下信息
$VAR1 = ' 4525';
$VAR1 = 'Snap data - Important Snap data 5674 Stack data - Important Stack data 5421';
预期的:
$VAR1 = ' 4525';
$VAR1 = 'Snap data - Important Snap data 5674';
$VAR1 = 'Stack data - Important Stack data 5421';
背景:
受错误 4525 影响的文件是
“快照数据 - 重要快照数据 5674”和“堆栈数据 - 重要堆栈数据 5421”
\\R
代表任何类型的换行符,您可以使用触发器运算符:
my @snapData;
while(<DATA>) {
if (/^Affected Snap:/ .. /^Affected Stack:/) {
s/\R+//;
next if /^\s*$/;
next if /^Affected /;
push @snapData, $_;
}
}
print Dumper\@snapData;
__DATA__
Affected Snap:
Snap data - Important Snap data 5674
Stack data - Important Stack data 5421
Affected Stack:
TestStream1 - Important Stack 6322
输出:
$VAR1 = [
'Snap data - Important Snap data 5674',
'Stack data - Important Stack data 5421'
];
你为什么不使用 chomp 命令?
代码
use strict;
use warnings;
use Data::Dumper;
my @snapData;
while (<DATA>) {
if (/^Affected Snap:/ .. /^Affected Stack:/) {
chomp;
s/\s+$//;
next if /^\s*$/;
next if /^Affected /;
push @snapData, $_;
}
}
print Dumper\@snapData;
__DATA__
ParseLog.log:
Bug : 4525: TC1
Scan Summary:
Affected Snap:
Snap data - Important Snap data 5674
Stack data - Important Stack data 5421
Affected Stack:
TestStream1 - Important Stack 6322
No Longer Affected Snap:
None
编辑输出
$VAR1 = [
'Snap data - Important Snap data 5674',
'Stack data - Important Stack data 5421'
];
假设这是在 Unix/Linux 系统上..
速战速决,我使用了太多往往是cat
与CR + LF文件到通过命令行的新文件,如下所示...
cat original.txt > fixed.txt
我并不是说这是解决此问题的最佳方法,但至少这样^M
都会被 cat 忽略并且不会移动到 fixed.txt 文件中。
然后您需要做的就是根据需要解析fixed.txt。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.