所以我有一个看起来像这样的日志文件:
's/EVENT-header((?!\n\n).)+peach((?!\n\n).)+\n\n/&/p'
我要做的是提取包含单词" peach"的文本块(从EVENT-header到下一个EVENT-header之前的两个换行符)。
我认为这是正则表达式会解决的一个问题,但我在制作正则表达式时遇到了麻烦。这是我到目前为止所得到的:
#An example line of the output from the API:
{'tick': {'instrument': 'AUD_USD', 'bid': 0.74692
, 'time': '2015-07-09T07:42:48.127521Z', 'ask': 0.74709}}
我不是这方面的专家。有没有一种简单的方法可以使用regex / perl?
答案 0 :(得分:2)
您可以使用段落模式轻松完成此操作,这会使perl读取由空行分隔的文本块
perl -00 -ne'print if /peach/' logfile.log
如果您更喜欢完整的程序文件,那么它看起来像这样
use strict;
use warnings;
open my $fh, '<', 'logfile.log' or die $!;
{
local $/ = '';
while ( <$fh> ) {
print if /peach/;
}
}
答案 1 :(得分:0)
答案 2 :(得分:0)
有多种方法可以做到这一点,多线正则表达式匹配是一个很好的选择。如果数据文件与显示的一样规则,特别是每个&#34;记录&#34;由标记&#39; EVENT-header&#39;分隔,然后你也可以使用设置$ /(又名$ RS又$ INPUT_RECORD_SEPARATOR)的技巧作为这个标记,然后将文件啜饮成一个数组。您将为文件中的每条记录获取一个数组条目,然后循环遍历该数组,选择匹配“桃子”的元素,并打印出整个包含的内容记录。
例如:
#!/usr/bin/perl -w
use strict;
$/='EVENT-header';
my (@entries, $entry);
my $infile = 'data.txt';
open(IN, "<$infile") or die "Aaargh: $^E\n";
@entries = <IN>;
chomp @entries;
close(IN);
foreach $entry (@entries)
{
if ($entry =~ m/peach/)
{
print "matching entry: $entry\n";
}
}
答案 3 :(得分:0)
Borodin 已经为您的问题提供了最佳解决方案。但是这里有一个代码,以防你不想使用一个班轮:
#!/usr/bin/perl
use warnings;
use strict;
local $/ = ""; #to enable paragraph mode
open my $fh, "<", "input.log" or die "Unable to open file: $!";
while (my $line = <$fh>)
{
chomp $line;
if ($line =~ m/peach/)
{
print $line, "\n";
}
}
输出:
EVENT-header
apple
orange
peach
blueberry