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 在 文本处理
91KB
1K SLoC
大纲 grep
搜索缩进结构化文本文件的强大工具。
受 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",
现在这很有用!我们立即知道该文件包含在“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
支持
ogrep
与git grep
内建集成:当给出-g
选项时,第二个参数作为路径规范传递给git grep
。所有相关选项(如-w
、-i
等)也自动传递给git grep
,强制使用--print-filename
。
ogrep -g cache_used '*.cc'
依赖项
~4.5MB
~90K SLoC