【问题标题】:Regex to search a multi-line field in a text file正则表达式搜索文本文件中的多行字段
【发布时间】:2013-03-04 13:12:42
【问题描述】:

我有一个日志文本文件。在其中我有兴趣使用一些正则表达式搜索字段(我在 Win 上使用 notepad++,但甚至在 Ubuntu 上使用 vim 来解析/读取此日志文本文件,所以任何一个都可以)

文本文件有如下条目。

src.type= DEVICE_1     <-- there is a space and then a newline char after the last letter which is 1
dst.type= ZONE_1
someparam1

src.type= DEVICE_1 
dst.type= ZONE_2
someparam2

此类条目在日志文本文件中不断重复。

我有兴趣找到其中包含 DEVICE_1 的那些行,但仅适用于那些后面有 dst.type= ZONE_2 的行,即

我打算去找

src.type= DEVICE_1 
dst.type= ZONE_2

但不是

src.type= DEVICE_1
dst.type= ZONE_1

Notepad++ 允许使用关键字作为正则表达式进行搜索。我可以获得一个有效的正则表达式或任何其他方式(不一定涉及正则表达式)来找到我在文本文件中寻找的此类事件。

我在notepad++搜索中尝试使用正则表达式但没有成功:

src.type= DEVICE_1 \ndst.type= ZONE_2

还尝试了[ ] 字符类。

如何搜索我要查找的内容?

【问题讨论】:

  • 如果您在 Windows 上,换行符实际上是两个字符,一个换行符和一个回车符。即使您在 Ubuntu 上的 vim 中打开它,我认为 vim 也会识别 Windows 换行符并确保保留格式,因此即使您正在编辑文件,您也可能不知道该文件正在使用 Windows 换行符Ubuntu

标签: regex search vim notepad++


【解决方案1】:

在 Vim 中,以下模式似乎符合您的要求:

DEVICE_1\s*\n.*ZONE_2

使用/DEVICE_1\s*\n.*ZONE_2 跳转到下一场比赛。

使用:g/DEVICE_1\s*\n.*ZONE_2/command 在每场比赛中执行command

使用:vim DEVICE_1\s*\n.*ZONE_2 % | cw 列出quicfix 窗口中的所有匹配项。

请注意,您可以使用 // 轻松重用最新的搜索模式。使用/foo 处理您的搜索模式是一种常见策略,一旦您感到满意,请执行如下替换:

:%s//bar

【讨论】:

  • +1 以获得漂亮的搜索结果概览:vimgrep|copen 我通常会使用 :g yank 或注册重定向。从你那里学到了一些东西。再来一次!
【解决方案2】:

在 Notepad++ 中,使用以下正则表达式,启用“.matches newlines”复选框:

src.type= DEVICE_1\s+dst.type= ZONE_2

【讨论】:

  • 谢谢。在记事本++中尝试过,但没有奏效。选中了 .matches 换行符框。找不到文字是记事本所说的
  • 奇怪,当我复制粘贴你的例子时它对我有用......我会添加一个截图,也许你错过了一些东西。否则,也许您应该提供有关文本源格式的更多详细信息。
  • 它也适用于我。事实上,您不需要选择点匹配换行模式; \s+ 处理这些。
  • 哈!没错,我不知道。谢谢!
【解决方案3】:

Vim 就是这样:

/^\zssrc.type= DEVICE_1\ze\_.\{2,2}\_^dst.type= ZONE_2$/

重要表达式的分解:

  1. \zs - 从这里开始比赛(将从这里突出显示);
  2. \ze - 在此处结束比赛(将在此处突出显示);
  3. \_. - 与 . 相同,但也包括新行;
  4. \_^ - 类似于 ^,但 \_ 是必需的,因为我们在中间 正则表达式。

对于其他人,我建议你参考 Vim 的文档。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-20
    • 1970-01-01
    • 2023-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多