本文最后更新于 822 天前,其中的信息可能已经有所发展或是发生改变。
grep
在 *nix 系统都有预装,也是程序员日常工作经常用到的工具。我最近的工作,涉及到很多大文本处理,grep 处理得不是很快。于是就用到了 ripgrep,这个工具跑起来快很多。本文主要摘录自己平时可能会用到的用法
安装
在 GitHub Repo 的指引下找到你对应的系统命令安装即可,一行命令。
安装完之后,ripgrep 的可执行命令是 rg
常用参数
一般搜索
rg str sample.txt
默认,标准输出会高亮你的搜索词,并且每行前面会有行号。不过请放心,重定向到另一个文本时,是不包含行号的。
如果你不想要输出行号,使用 -N
rg str sample.txt -N
统计行数
rg str sample.txt -c # 相当于 grep str sample.txt | wc -l
And 条件
A ha, 现在还不支持,老早就有很多用户提这个需求了。看看固执的作者什么时候允许加上。可以关注这个 Issue。
只能管道后再次筛选了, --color always
是为了第一个搜索词也能被高亮
rg str sample.txt --color always | rg str2
Or 条件
使用多个 -e 参数 作为条件。只要匹配到任何一个搜索词,都会被匹配到
rg -e 'str1' -e 'str2' -e 'str3' sample.txt
匹配到N条结果就停止
很多情况下,我们知道只有 N 条匹配项,为了节约时间,希望匹配到足够数量就不要往下搜索了。
rg str sample.txt -m 数量
不输出文件名
默认情况下, ripgrep 会在每行开头输出文件名。当我们需要结合 grep 做统计分析的时候,往往不期望输出文件名。Just add the flag -I
rg 'hello' sample.txt -I
正则
下边的 -e
可以不加,因为默认把搜索词当做正则。
如果希望把搜索词当成普通文本处理,使用 -F
,为什么默认要当成正则呢,神奇的设计,可能文件搜索普遍使用正则?
rg -e '^UE.+?NL' sample.txt
如果期望只输出正则匹配到的组(group),那么可以结合 -r flag 来做到。原理就是将整行文本替换成 $1 (group 1)
rg -e '^.*?(your-pattern).*?$' sample.txt -r '$1'
替换文本
会将搜索到的文本,替换成你指定的再输出。使用 -r
。
注意,该参数不会改变你原来的文本,只是输出时替换文本
rg -e '123456' sample.txt -r '******'
如果希望实现替换原有文件的特定文本,可以这么做:
rg --passthru 'like' sample.txt -r 'love'
--passthru
参数会将未匹配的行也进行标准输出