【问题标题】:Regex expression to select pair of lines正则表达式选择一对线
【发布时间】:2015-01-24 22:08:41
【问题描述】:

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

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/>

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

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

【问题讨论】:

  • 什么编辑器程序?

标签: regex editor expression


【解决方案1】:

在基于 mac 或 unix 的操作系统上使用 grep

grep -i error -A2 inputfile

【讨论】:

  • 这正是我想要的。谢谢。
【解决方案2】:

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

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

^ ...从行首开始每次搜索。

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

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

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

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

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

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

换句话说,此表达式匹配包含单词Error 的任何位置的整行、第一行的行终止符以及下一行到行尾的所有内容,但不匹配第二行的行终止符。

UltraEdit 是一个可用于 Windows、Linux 和 Mac 的共享软件文本编辑器。

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

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

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

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

还有一点:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-18
    • 1970-01-01
    • 2018-11-29
    • 1970-01-01
    • 2015-01-11
    • 2016-01-11
    • 1970-01-01
    • 2010-09-16
    相关资源
    最近更新 更多