我的数据格式如下所示来自外部程序,需要获取每行的前4个字段(文本,用户名,数字和时间戳)。请注意,Hello line1是一个字段,第二个是用户名。格式输出可以是单行,如下面的line1或三行,如line2或两行,如下面的line4。而且格式可以像下面那样混合(不是单行总是或双等)
Hello Line1 FirstName.LastName 10 3/23/2011 2:46 PM
Hello Line2
Line2FirstName-LastName 8 7/17/2015 1:15 PM
Line2Testing - 12323232323 Hello There
Hello Line3 Line3FirstName.LastName 8 3/21/2011 2:46 PM
Hello Line4
Line4FirstName-LastName 8 9/17/2015 1:20 PM
Screen shot of above in a editor
我可以借助这个问题获得Multline RegEx:Perl multiline regex for first 3 individual items
感谢@GsusRecovery!
由于我正在逐行阅读,我不认为我可以通过阅读单线来利用多线RegEx。如果格式在一行中,是否可以只读取单行,如果在3行中展开,如果它在2行或3行中展开,则可以读取2行吗?
或者根据双线或三线格式读取每一条线和回溯线是否更好。
请建议。
答案 0 :(得分:0)
最好使用单一方法而不是打开每条线,因为没有迹象表明单线/多线预先发生。因为你有(int)和(date)的固定格式,所以只需使用一个匹配如下内容的多行正则表达式模式:(伪正则表达式代码)
\s+ (.*) \s+ (.*) (\d+) (\d+\/\d+\/\d+ \d+\:\d+ [AP]M)$
space text space name int date
不要忘记使用/ m进行多行匹配。由于单/多线模式除了\ n和额外间距外几乎相同,因此可以在所有情况下使用相同的模式。
答案 1 :(得分:0)
更新:我已将脚本更改为接受标准输入并将其作为数组放入@output_lines
(以模拟@sureng的输入情况)
我将正则表达式包装在一个行累加器中,它将小时识别为结束模式。通过这种方式,您可以逐行解析输出,然后应用正则表达式。
#!/usr/bin/perl
use strict;
use warnings;
my ($accumulator,$chat,$username,$chars,$timestamp);
my @output_lines = <STDIN>;
foreach (@output_lines)
{
$accumulator .= $_;
($chat,$username,$chars,$timestamp) = $accumulator =~ m/(?im)^\s*(.+)\s+(\w+[-,\.]\w+)\s+(\d+)\s+([0-1]?\d\/[0-3]?\d\/[1-2]\d{3}\s+[0-2]?\d:[0-5]?\d\s?[ap]m)\s*$/;
$chat =~ s/\s+$// if $chat; #remove trailing spaces
if ( $accumulator =~ /(?i)([0-2]?\d:[0-5]?\d\s?[ap]m)/ ) {
print "SECTION matched\n";
print "-"x80,"\n";
print "$accumulator";
print "-"x80,"\n";
print "chat -> ${chat}\n";
print "username -> ${username}\n";
print "chars -> ${chars}\n";
print "timestamp -> ${timestamp}\n\n";
$accumulator = ''; # reset the line accumulator
}
}
在线尝试解决方案(将您的示例作为标准输入提供)here。
在你的shell中,给出上面的脚本和这个输入文件:
# MultiLineInput.txt
Hello Line1 FirstName.LastName 10 3/23/2011 2:46 PM
Hello Line2
Line2FirstName-LastName 8 7/17/2015 1:15 PM
Line2Testing - 12323232323 Hello There
Hello Line3 Line3FirstName.LastName 8 3/21/2011 2:46 PM
Hello Line4
Line4FirstName-LastName 8 9/17/2015 1:20 PM
您只需致电:
cat MultiLineInput.txt | StreamRegex.pl
如果按预期工作,您可以用您的来源替换cat
命令。
NB :如果您处理流或者您的文件大于系统的易失性内存(因此您希望将其作为流处理),则需要此方法,但是,表示,无论如何都适用。