正则表达式到 select 对行

Regex expression to select pair of lines

我有一个日志文件。它的一般格式是

log text 1  <br/>
log text 2  <br/>
Error: xxxxxx  <br/>
error description (1 line only)  <br/>
log text 3 <br/>
log text 4  <br/>
....  <br/>
Error: xxxxxx  <br/>
error description (1 line only)  <br/>
log text 5  <br/>
....  <br/>

我想 select 并提取包含错误的 2 行对(每个错误有两行。第一行总是有 Error: 作为关键字。Word Error 不会出现在日志文件的其他任何地方)。

我如何使用正则表达式或任何其他方式来做到这一点。我可以使用 MacOS、Unix 或 Windows XP。首选 MacOS。

在 mac 或基于 unix 的 OS

上使用 grep
grep -i error -A2 inputfile

查找这两行的正则表达式例如:

^.*?Error.*(?:\r?\n|\r).*$

^ ... 在一行的开头开始每次搜索。

.*? ... 匹配除回车 return 和换行之外的任何字符零次或多次非贪婪。非贪婪意味着尽可能少的字符。换句话说,在 Error 第一次出现时停止,而不是在最后一次出现时停止。

Error ... 这个词必须在两行的第一行中找到才能匹配。

.* ... 匹配除回车 return 和换行之外的任何字符零次或多次贪婪。贪婪意味着现在匹配尽可能多的字符。

(?:\r?\n|\r) ... 是匹配回车符 return + 换行符(DOS/Windows 文本文件)或仅换行符(UNIX 文本文件)的非标记组),或仅回车 return(旧 MAC 文本文件)。

.* ... 匹配除回车 return 和换行之外的任何字符 0 次或多次贪心。

$ ... 行尾的锚点。匹配字符串中不包含行终止符。

换句话说,这个表达式匹配包含单词 Error 的整行,第一行的行结束符和下一行直到行尾的所有内容,但不匹配的行结束符这第二行。

UltraEdit 是适用于 Windows、Linux 和 Mac.

的共享软件文本编辑器

Search - Find 对话框中使用此 Perl 正则表达式 UltraEdit 高级查找选项 列出包含字符串的行 启用导致将所有找到的 2 行字符串写入 window 列出所有找到的行。

打开此 window 的上下文菜单(右键单击 Windows)并单击 复制到剪贴板 会导致将所有找到的行复制到系统剪贴板。

按 Ctrl+N 打开一个新文件,按 Ctrl+V 粘贴复制的行,按 Ctrl+S 保存新文件最终得到一个包含所需信息的文件。

另一种方法是使用 UltraEdit 脚本 FindStringsToNewFile 和简化的正则表达式搜索字符串 Error.*(?:\r?\n|\r).*。此脚本将所有找到的以关键字 Error 开头并在下一行末尾结束的字符串直接写入新文件。

再补充一点:

如果 .(点)也匹配换行符,如回车 return 并且换行符取决于标志。在 UltraEdit 中,标志默认设置为点不匹配换行符。在 Perl 正则表达式搜索字符串的开头使用 (?s) 标志被更改,然后点将匹配此搜索的换行符。在搜索字符串的开头使用 (?-s) 如果应用程序的内部默认设置相反,则可以将标志设置为不通过点匹配换行符。