Regex / Perl匹配包含字符串的文本块

时间:2015-07-10 03:36:24

标签: regex perl

所以我有一个看起来像这样的日志文件:

'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?

4 个答案:

答案 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)

EVENT-header\n[\s\S]*?(?=(?:\n\nEVENT-header|$))

你可以使用它。参见演示。

https://regex101.com/r/hR7tH4/3

答案 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