我有以下输入,我想写一个正则表达式,它将匹配除第一个和最后一行之外的每一行。
2019-03-13 00:33:44,846 [INFO] -: foo
2019-03-13 00:33:45,096 [INFO] -: Exception sending email
To:
[[email protected], [email protected]]
CC:
[[email protected]]
Subject:
some subject
Body:
some
body
2019-03-13 00:33:45,190 [INFO] -: bar
我认为以下应该可行,但它不匹配任何东西:
pcregrep -M ".+Exception sending email[\S\s]+?(?=\d{4}(-\d\d){2})" ~/test.log
用简单的英语我会将其描述为:寻找带有异常文本的行,然后是非贪婪的任何字符(包括换行符),直到我们为日期达到正向前瞻。
出于某种原因,这也包括最后一行,即使it doesn't on regex101。我在这里错过了什么?
在很多情况下,我会在这样的情况下使用grep -A
,但问题是身体可能是任意数量的线。
它几乎肯定与该工具有关。作为pcregrep的changelog在“版本8.12 15-Jan-2011”下声明:
- 在pcregrep中,当以多行模式匹配以文字换行序列结束的模式时,以下行显示为匹配的一部分。这似乎是错的,所以我改变了它。
一个简单的解决方法是在前瞻表达式中添加换行符,这会将其拉出匹配并阻止最后一行显示:
pcregrep -M ".+Exception sending email[\S\s]+?(?=[\r\n]\d{4}(-\d\d){2})" ~/test.log