4 个版本 (2 个破坏性更新)

使用旧的 Rust 2015

0.4.0 2019年9月24日
0.2.1 2018年3月16日
0.2.0 2018年3月16日
0.1.0 2018年3月8日

#1378文本处理

MIT 许可证

91KB
1K SLoC

大纲 grep

搜索缩进结构化文本文件的强大工具。

Matt Brubeck 的 ogrep 启发。那个 ogrep 紧凑且美观,但功能有限。

另请参阅 ogrep — 用 Python 编写的此工具的移植版本(实际上,它首先是这样的)。

简介

ogrepgrep 非常相似,两者都可以搜索匹配项并显示其上下文。但在 grep 中,上下文是“匹配项前后 N 行”,而在 ogrep 中,上下文是“匹配项上方具有较低缩进的行”。

让我解释一下。我主要在处理 GN 构建文件时使用这个工具,所以我会使用 一些大型 BUILD.gn 文件 作为例子。常见的任务是搜索源文件名,并了解哪个目标包含此文件以及条件。

让我们找到“arena.cc”文件的提及

# grep arena.cc BUILD.gn
      "base/arena.cc",

好的,现在我们知道我们的文件在这里,但不知道目标。让我们请求一些上下文

# grep -C2 arena.cc BUILD.gn
      "base/address_tracker_linux.cc",
      "base/address_tracker_linux.h",
      "base/arena.cc",
      "base/arena.h",
      "base/backoff_entry.cc",

不,这没有太多帮助。让我们试试 ogrep

ogrep arena.cc BUILD.gn
 102: component("net") {
 385:   if (!is_nacl) {
 386:     sources += [
 409:       "base/arena.cc",

现在这很有用!我们立即知道该文件包含在“net”目标中,在“!is_nacl”条件下。

甚至更好,因为 ogrep 可以使用颜色,这里是一张图片

安装

使用 Cargo(任何平台)

如果您还没有安装,请安装 Rust 和 Cargo,然后

cargo install ogrep-rs

MacOS

安装 Homebrew,然后

brew install kriomant/ogrep-rs/ogrep-rs

其他平台

对不起,目前还没有,但我正在努力。现在请使用 Cargo。

选项

有很多可用的选项,运行 --help 列出它们。

此工具不仅对严格基于缩进的文件(如 Python 源文件)或 GN 构建文件有用,还对广泛的文本文件有用,因为即使不是基于缩进的文件也通常以方便的方式进行格式化。

甚至内置了一些与 C 相关的技巧。

以下是简要的功能列表

  • 默认情况下,模式是固定文本,但您可以使用 -e 使用任意正则表达式。

  • 常规的 -w(匹配整个单词)和 -i(不区分大小写的搜索)都可用。

  • 工具在匹配项之间保留一些空白行,因为这有助于在视觉上分离相关匹配项组,您可以使用--no-breaks关闭此功能。

  • 有时查看匹配项之间的其他行是有用的。使用--ellipsis即可实现。

  • 如果您将otool与外部工具集成,--print-filename选项可能很有用,它会在找到任何匹配项时打印文件名。

  • 默认情况下,“if-else”分支被特殊处理:if-分支被保留,这样即使匹配项在“else”分支中找到,您也能知道条件。

  • 使用--context/-C--before-context/-B--after-context/-A选项,也支持传统的上下文(显示匹配项周围的N行前导和/或尾随行)。

# ./ogrep filename_util_icu BUILD.gn
 102: component("net") {
2106:   if (!is_nacl) {
2210:     if (use_platform_icu_alternatives) {
2222:     } else {
2228:       sources += [
2229:         "base/filename_util_icu.cc",

可以使用--no-smart-branches关闭此功能。

  • C文件中的预处理器指令通常不进行缩进(或者缩进在“#”之后插入)。因此,工具默认忽略预处理器指令,直到给出--no-ignore-preprocessor

计划实现更智能的预处理器指令处理(并行上下文)。

在目录中搜索

与外部工具集成

otool旨在在单个文件中搜索。它并不快,不能用于搜索多个文件。但您可以将其与其他搜索工具集成,如下所示

grep -l cache_used -r . --include='*.cc' | xargs -n1 ogrep --print-filename cache_used

内建的git grep支持

ogrepgit grep内建集成:当给出-g选项时,第二个参数作为路径规范传递给git grep。所有相关选项(如-w-i等)也自动传递给git grep,强制使用--print-filename

ogrep -g cache_used '*.cc'

依赖项

~4.5MB
~90K SLoC