Regex perl多行问题:需要一行程序来打印文件中字符串之前的最后一个匹配

Regex perl多行问题:需要一行程序来打印文件中字符串之前的最后一个匹配,regex,perl,multiline,Regex,Perl,Multiline,我有这样一个日志文件: 2018-07-10 10:03:01: random text1 2018-07-10 10:03:02: random text2 2018-07-10 10:03:03: random text3 more text and more THIS IS MATCHED STRING 2018-07-10 10:03:04: random text4 我想使用perl one liner查找“THIS IS MATCHED STRING”之前的

我有这样一个日志文件:

2018-07-10 10:03:01: random text1
2018-07-10 10:03:02: random text2
2018-07-10 10:03:03: random text3
    more text
    and more
    THIS IS MATCHED STRING
2018-07-10 10:03:04: random text4
我想使用perl one liner查找“THIS IS MATCHED STRING”之前的最新时间戳

我试过这个:

perl -0777 -nle 'print "$1\n" while m/(\d\d\d\d-\d\d-\d\d \d\d:\d\d:\d\d).+?THIS IS MATCHED STRING/sg'
但它匹配了第一个时间戳“2018-07-10 10:03:01”,而不是我想要的“2018-07-10 10:03:03”。显然(至少我认为),我不太了解贪婪/懒惰匹配是如何工作的

任何帮助都将不胜感激

您可以使用

^
(\d{4}-\d{2}-\d{2}\ \d+:\d+:\d+):
(?:(?!^\d{4})[\s\S])+?
\QTHIS IS MATCHED STRING\E

请参阅。

了解一种相当基本的方法,该方法避免了涉及到的正则表达式,逐行处理,并在匹配时间戳模式时记录它。然后,当您运行到模式
这个…
时,您将拥有(最后一个)上一个时间戳

perl -wnE'
    $ts = $1 if /(\d{4}-\d{2}-\d{2}[ ]\d{2}:\d{2}:\d{2})/; 
    say $ts // "no previous time stamp"  if /THIS IS MATCHED STRING/;
' file.txt
如果捕获时间戳并将其与
($ts)=/…/
一起保存,则行上的失败匹配没有将其打开
undef
,因此在找到
时它可能不在那里。因此,只有在存在匹配项时,才会从
$1
中保存它


$ts
上定义的or(
/
)用于防止文件在
之前根本没有时间戳,这显然更容易理解。我会记下来的。谢谢@韦尼亚。欢迎:)还要注意,通常有两种方法——要么全部在正则表达式中完成,然后可能会变得高级和棘手,要么使用基本处理和基本正则表达式。