【发布时间】:2017-08-11 09:02:03
【问题描述】:
给定一个包含 100000 多条日志消息的文件,例如:
2017-08-10T14:49:09: Debug: D-UNK-000-000: [Event Processor] connectorStatus: Pending
2017-08-10T14:49:09: Debug: D-UNK-000-000: [Event Processor] context: <DataItem type="System.Availability.StateData" time="2017-08-04T01:10:59.9525690+02:00"><ManagementGroupId>{05120214-5C27-A4EE-D32B-09CB2239421C}</ManagementGroupId><Property Name="Details" VariantType="8">There are 1 messages attached
03.08.2017 21:00:12
Title: Mail sync issue
User Impact: Users are unable to sync emails using Apple Mail on their Mac computers.
</Property></DataItem>
2017-08-10T14:49:09: Debug: D-UNK-000-000: [Event Processor] context_ManagementGroupId: {05120214-5C27-A4EE-D32B-09CB2239421C}
2017-08-10T14:49:09: Debug: D-UNK-000-000: [Event Processor] context: null
2017-08-10T14:49:09: Debug: D-UNK-000-000: [Event Processor] context_HealthServiceId: 390382B5-C177-0529-DDC0-F2969F667E49
每条日志消息都从一个以时间戳开始的新行开始。但是有些日志消息会延伸到多行;在上面的示例中,请参见包含“上下文:”的第二行,然后是一些嵌入了多个换行符的任意 xml。因此,在上面的示例中,恰好有 5 条日志消息。
我正在寻找很长的日志消息,比如超过 15000 个字符。
我可以使用 Notepad++ 单步执行所有相关的日志消息来搜索此模式(选择“.matches newline”选项):
context:(.+?)2017-0\d-\d\dT\d\d:\d\d:\d\d:
但我没有说明它只会给我长的。
我希望以下方法可以工作,但没有运气(它选择了整个文件):
context:(.+?){15000,}2017-0\d-\d\dT\d\d:\d\d:\d\d:
如果 Notepad++ 无法做到这一点,我也愿意使用其他工具,包括 linux 机器上的命令行。
没有必要,但如果容易的话:
搜索与我解释的相同的内容,并将整个 xml 字符串替换为其长度(字符数)。
【问题讨论】:
-
尝试
(?s)context:(?:(?!2017-0\d-\d\dT\d\d:\d\d:\d\d:).){350,}并将350调整到您的阈值。 -
Wiktor,你真是个天才 :-) 也许你能解释一下这是怎么回事?
-
我添加了一个带有一点解释的答案。
标签: regex notepad++ newline multiline