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