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;
此$行变为
错误:4525:TC1Scan摘要:-------------受影响的快照:快照数据 - 重要快照数据5674堆栈数据 - 重要堆栈数据5421 受影响的堆栈:TestStream1 - 重要堆栈6322不再受影响的快照:无不再受影响堆栈:无
我能够解析Bug编号(Bug: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”
答案 0 :(得分:3)
\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'
];
答案 1 :(得分:0)
为什么不使用chomp命令?
<强> CODE 强>
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'
];
答案 2 :(得分:-1)
假设这是在Unix / Linux系统上..
我经常使用的 快速修复是通过命令行将带有CR + LF的文件<!-- Used by Spring to pick up annotations -->
<integration:annotation-config/>
<context:component-scan base-package="myproject"/>
<bean id="myDAOBean" class="org.gosh.financeimport.dao.MyDAOImpl" >
<constructor-arg name="dataSource" ref="reDataSource"/>
<constructor-arg name="sql" value="dbo.MySP" />
</bean>
<!-- properties stored in a separate file -->
<bean id="myDataSource" class="com.microsoft.sqlserver.jdbc.SQLServerDataSource">
<property name="databaseName" value="${myDataSource.dbname}" />
<property name="serverName" value="${myDataSource.svrname}" />
<!-- also loaded portNumber, user, password, selectMethod -->
</bean>
放到一个新文件中,如下所示...
cat
我并不是说这是解决此问题的最佳方法,但至少这样cat original.txt > fixed.txt
全部被cat忽略,而不会移到fixed.txt文件中。
然后您需要做的就是根据需要解析fixed.txt。