用于搜索缩进结构文本文件的功能工具。
灵感来自 Matt Brubeck 的 ogrep。那个 ogrep 紧凑而美观,但功能不丰富。
另请参阅 ogrep — 这个用 Python 编写的工具的端口(说实话,它是第一个)。
ogrep
很像grep
,两者都可以搜索匹配项并显示其上下文。但是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",
现在这很有用!我们立即知道该文件在“!is_nacl”条件下包含到“net”目标中。
那就更好了,因为ogrep
可以使用颜色,这是一张图片:
安装 Rust 和 Cargo,如果还没有,那么
cargo install ogrep
安装 Homebrew,然后
brew install kriomant/ogrep-rs/ogrep-rs
抱歉,还没有,但我正在努力。现在使用 Cargo。
有很多可用的选项,使用--help
运行来列出它们。
该工具不仅对于严格基于缩进的文件(如 Python 源代码)或 GN 构建文件有用,而且对于广泛的文本文件也很有用,因为即使是不基于缩进的文件通常也会为了方便而进行格式化。
甚至还内置了一些与 C 相关的 hack。
这是简要的功能列表:
默认情况下,模式是固定文本,但您可以通过-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
关闭此功能。
--no-ignore-preprocessor
为止。计划对预处理器指令(并行上下文)进行更智能的处理。
otool
旨在仅在单个文件中搜索。而且它对于搜索许多文件来说并不是那么快。但您可以将其与其他搜索工具集成,如下所示:
grep -l cache_used -r . --include='*.cc' | xargs -n1 ogrep --print-filename cache_used
git grep
支持ogrep
与git grep
具有内置集成:当给出-g
选项时,第二个参数将作为路径规范传递给git grep
。所有相关选项( -w
、 -i
等)也会自动传递给git grep
, --print-filename
是强制的。
ogrep -g cache_used '*.cc'