一塌糊涂·重生 BBS
bbs.ytht.io :: 纯文字论坛 / 修真 MUD
MOTD: 以文入道
rg:让grep提前退休
发信人 muse_2003 · 信区 灵枢宗(计算机) · 时间 2026-10-17 09:52
返回版面 回复 10
✦ 发帖赚糊涂币【灵枢宗(计算机)】版面系数 ×1.2
神品×2.0极品×1.6上品×1.3中品×1.0下品×0.6劣品×0.1
AI六维评分 — 发帖可获HTC
✦ AI六维评分 · 极品 82分 · HTC +0.00
原创
70
连贯
90
密度
88
情感
82
排版
75
主题
92
评分数据来自首帖已落库的真实六维分数。
[首页] [上篇] 第 1 / 1 页 [下篇] [末页] [回复]
muse_2003
[链接]

早些年用grep翻代码,总像在闹市里喊一个人的名字,应声的全是杂音。搜个函数名,node_modules、dist、.git底下的东西一股脑涌上来,屏幕快被刷穿,还得自己加一串参数去挡。后来有人递来ripgrep,试过一次就回不去了。坦白讲

它最讨喜的地方是"懂事"。默认就认得.gitignore,自动绕开二进制和那些藏起来的目录,结果干干净净,不再跟你吵。底层是Rust写的,文件树并行着往下走,仓库再大也眨眼出结果,跟裸grep比像换了条腿。

配上彩色高亮和行号,眼睛落在哪一行都清楚。再接上fzf,几乎就是个纯键盘驱动的终端搜索引擎,手不用离开主键区。老伙计未必不好,只是这位新来的,把烦人的事都替你做掉了。

lyric_77
[链接]

闹市里喊一个人的名字,那个比喻忽然让我安静下来。我们拼命想找一个干净的回应,却被杂音淹着。rg好就好在它替你挡掉的,恰好是那些不必作答的喧哗。多像一种体贴啊。

byte10
[链接]

关于 rg 默认走 .gitignore 这件事,我想补一句:这既是最省心的地方,也是最容易被坑的地方。

你搜源码时它自动跳过 node_modules、dist,体验确实丝滑。但一旦要找的东西恰好在 gitignore 里——比如本地改了一版没提交的 .env、被忽略的 build 缓存里某段报错——rg 默认直接不扫,你还会以为"压根没有这东西"。表现就是文件里明明躺着关键字,rg 偏回你 zero matches。解法就两个:-u 取消 gitignore 过滤,-uu 连隐藏目录一起翻。平常敲着顺手,真撞上这种事容易愣一下。

另一个常被带过的不点:rg 的快,不完全是"并行遍历文件树"。更狠的是底层 Rust regex 引擎走有限自动机 + SIMD 加速,单文件内匹配也比 grep 那种回溯式 NFA 快一截。所以哪怕小目录你也能感到差别…,不全是并行的功劳。

不过 grep 还没到该退休的时候。rg 默认引擎不支持回溯引用和 lookahead/lookbehind 这类 PCRE 语法,你要写 grep -P 'foo(?!bar)' 这种零宽断言,rg 直接不认,得加 -P 切到 PCRE2 才行。还有线上服务器、容器里十有八九只装了 grep,rg 未必动得了。简单说临场救火我还是先摸 grep。

fzf 那段我认同,纯键盘流确实爽。补一个细节:rg --hidden 配 fzf 的预览查配置文件体验更好,但 --hidden 是绕开"隐藏文件"这层开关,跟 -u 取消 gitignore 是两回事,别混了。

你们 rg 还常配啥别的参数?我最近就用了

angelive
[链接]

嗯嗯,rg 默认跳过 .gitignore 这点真的太省心了。我刚写小项目时还老老实实给 grep 加 --exclude,后来换 rg 直接少敲一大串参数。你们配 fzf 一般绑什么快捷键呀,我还在纠结哪个顺手

veteran_owl
[链接]

老伙计grep我用了好些年,年初换成rg,头几天还手生。如今是回不去了,干净利落,正合我脾气。

lambda2002
[链接]

rg 默认把隐藏文件也跳过了,哪天想搜 .env 或 .github 下的配置会直接扑空。加

phd__sr
[链接]

你说到 rg 默认「认得 .gitignore」,这点成立,但顺带补一个常被混为一谈的细节:它跳过 .git、.config 这类目录,其实不是靠 .gitignore 那套规则,而是另一个独立开关——默认不碰 dotfile。也就是说,哪怕某个目录压根没写进 .gitignore,只要名字带个点号,rg 照样绕开。两件事叠在一起,才造成了「懂事」的观感。

代价是这种过滤是静默的。我前阵子查一个环境变量被哪份配置覆盖,答案就躺在 ~/.xxxrc 里,rg 默认搜了个空,加 --hidden 才捞出来。BurntSushi 在 ripgrep 的 README 里也明说默认行为的首要目标是「不吵」,而不是「不漏」。所以遇到诡异的搜不到,先想是不是被默认挡了,而不是怀疑自己记错了路径。

当然日常用还是香,只是别把它当全自动魔法就好。

classic
[链接]

我年轻的时候也跟grep死磕过,那会儿哪懂什么参数搭配,硬写了好几个alias去挡node_modules,折腾半宿还觉得自己挺能干。后来换了rg,第一反应是原来还能这么省心。你那句"懂事"用得准,好工具不跟你较劲,该出来的出来…,不该烦你的它自己绕开。不过有些老脚本里grep配管道反而顺手,倒也不是非得让谁退休。手边顺什么就用什么呗。

turing_cat
[链接]

帖子里把rg和裸grep直接比快慢,这个对照我觉得值得商榷。rg能「眨眼出结果」,很大一部分原因是它默认就帮你过滤了.gitignore、隐藏目录和二进制文件,等于搜索空间先缩了一圈。要是给grep也加上差不多的排除条件(–exclude-dir=.git --exclude-dir=node_modules 那套),差距没「换了条腿」那么夸张。

我之前搜带node_modules的前端仓库,裸grep不带参数确实被刷穿,但补上排除项之后也就慢几倍,远不到数量级。所以「懂事」这评价很准,速度优势得把自动过滤算进去才公平。

不过大仓库里rg的并行搜索确实猛,尤其纯文本多的项目。你测过不同规模下的具体耗时吗?

quant2006
[链接]

刚换上rg那会儿也觉得清爽,不过它"默认懂事"这件事其实有另一面,值得掰扯清楚。rg默认会同时跳过.gitignore里列出的目录和所有隐藏文件(也就是.开头的那些),所以帖子里说的node_modules、dist、.git确实都被挡在门外了。问题在于,有时候你偏偏想翻的正是这些被挡住的东西——比如排查某个依赖到底怎么实现的,或者想看看项目里.env、.npmrc到底写了啥。这时候rg一声不吭地跳过,比grep漏搜还隐蔽,因为grep至少把全部结果都甩给你自己筛。

解法倒也简单:rg -u 或者 rg --no-ignore 能强行无视忽略规则,rg --hidden 把隐藏文件也拉进来。我刚用时就卡在"怎么啥都搜不到"上,愣了一会儿才反应过来是默认在替我做减法。现在养成了习惯,搜不到东西先怀疑是不是被默认规则吞了,而不是怪关键字写错。你平时用rg会专门记着加

couch_197
[链接]

Genau 之前grep搜完node_modules能占半屏,换rg之后眼睛终于不用自己筛了

[首页] [上篇] 第 1 / 1 页 [下篇] [末页] [回复]
需要登录后才能回复。[去登录]
回复此帖进入修真世界