09 - ripgrep - 快速查找档案内容

grep 是查找档案中内容的指令,在一般的作业情境下, grep 的功能是十分足够了,但是在开发作业时, grep 的某些预设就显得比较不合需求,例如只针对特定档案、不会显示行数与不会排除 .gitignore 中忽略的档案等。虽然大部分的功能都可以藉由特定的参数设定完成,但是多了参数就多了需要记忆的部分,也比较不直觉,因此使用一个专为开发设计的查找内容工具是个提升产能的方式。

更直觉的查找档案内容指令 - ripgrep

ripgrep 提供使用者直觉的内容查找指令,利用直观的使用方式,我们可以轻松无负担的找到需要的资料。

它有下面的特色:

  • 包含了大部分其他搜寻内容的指令,而且速度更快(参考与其他的搜寻工具的比较 )。
  • 依循 ignore 档案的设定,例如 .gitignore ,会将其所设定的范围排除在搜寻外,并会自动忽略隐藏档案与 binary 。
  • 可以针对特定的副档名进行搜寻。
  • 支援许多 grep 的功能,像是显示结果的上下文、搜寻多个 patterns 、搜寻字串的高亮等。
  • 支援除了 UTF-8 外的其他编码,像是 UTF-16 、 latin-1 、 GBK 、 EUC-JP 、 Shift_JIS 等。
  • 可以搜寻压缩的档案。
  • 在搜寻前,可以执行预处理器,处理一些原本无法搜寻的格式,例如 PDF 。

安装 ripgrep

使用 Homebrew 安装 ripgrep

brew install ripgrep

安装完成後,就可以使用 rg 指令叫用 ripgrep 了。

rg --help

--help 参数会列出说明供使用者参照。

使用 ripgrep

rg 的使用需要带有 PATTERN 参数,这就是搜寻的目标。

rg ripgrep

上例的 ripgrep 就是 PATTERN 参数,这个指令会去查找当前目录下所有档案内容中有 ripgrep 的结果。

https://ithelp.ithome.com.tw/upload/images/20210925/2010778989rA0aAjZD.png

如果想要搜寻特定档案,可以使用第二个参数指定档案。

rg ripgrep README.md

上例只会查找 README.md 中的内容。

https://ithelp.ithome.com.tw/upload/images/20210925/20107789DTpVZDpGI9.png

ripgrep 支援正规表达式的搜寻方式,因此你可以使用正规表达式的语法设定搜寻的 PATTERN

rg ' rip\w+'

上例会搜寻 rip 字串前面是空白,并且後面接一个以上字元的结果。

关於正规表达式的设定方式,可以参考 Docs.rs 的文件

上面就是 ripgrep 主要的使用方式,接下来会介绍几个常用的搜寻情境供使用者参考。

忽略的档案

ripgrep 的搜寻会依照对应的规则忽略特定的档案,如果在搜寻时,遇到下面的情况,会对其做忽略的动作:

  • 与下列档案中设定的 glob 相符时:
    • .gitignore (全域及本地)。
    • .ignore ,如果与 .gitignore 冲突,会以 .ignore 为先。
    • .rgignore ,如果与 .ignore 冲突,会以 .rgignore 为先。
  • 隐藏的档案与目录。
  • Binary 档案( ripgrepNUL 判断是否为 binary )。
  • Symlinks 。

ripgrep 提供了各式的参数,供使用者需要查询这些忽略档案时使用:

  • 使用 --no-ignore 将 ignore 档案包含在搜寻范围内。
  • 使用 --hidden 将隐藏档案与目录包含在搜寻范围内。
  • 使用 --text (或 -a )将 binary 包含在搜寻范围内。
  • 使用 --follow (或 -L )将 symlinks 包含在搜寻范围内。

ripgrep 另外提供了 --unrestricted (或 -u )、 -uu-uuu

  • -u :搜寻范围包含 ignore 档案设定的档案或目录。
  • -uu :搜寻范围包含 ignore 档案设定与隐藏的档案或目录。
  • -uuu :搜寻范围包含 ignore 档案设定、隐藏的档案与 binary 档案或目录。

如果不知道为什麽找不到目标的结果时,可以使用 --debug 参数,它会列出细节供使用者参考。

指定搜寻范围

在指令中使用 -g 参数,可以自己指定搜寻范围。

rg ripgrep -g '*.md'

上例就只会搜寻 .md 结尾的档案。

指定特定档案类型

在指令中使用 --type (或 -t )参数,可以设定要搜寻的类型。

rg ripgrep --type md
# equal
rg ripgrep -tmd

上例只会搜寻 md 类型的档案。

另外,也可以使用 -T 排除特定的类型:

rg ripgrep -Tmd

这样就不会搜寻 md 类型的档案了。

本文重点整理

  • grep 预设不是给予开发者使用,因此部分指令会较不直观,需要特别去记忆,拖慢查找的时间。
  • ripgrep 针对开发时的情境设计指令,因此可以轻松且直觉的使用 ripgrep 来针对开发相关的档案做检索。
  • ripgrep 指令为 rg
  • rg PATTERN 会搜索当前目录下所有档案中含有 PATTERN 内容的结果。
  • rg PATTERN PATH 会搜索特定 PATH 中含有 PATTERN 内容的结果。
  • PATTERN 可以是正规表达式。
  • rg 预设搜寻时会忽略部分档案,其忽略的范围如下:
    • 使用 ignore 档案设定的档案或目录。
    • 隐藏的档案或目录。
    • Binary 档案。
    • Symlinks 。
  • 使用特定参数可以寻找被忽略的档案或目录:
    • 查找 ignore : --no-ignore-u
    • 查找隐藏的档案或目录: --hidden
    • 查找 binary 档案: --text
    • 查找 Symlinks : --follow
    • 查找 ignore 与隐藏的档案或目录: -uu
    • 查找 ignore 、隐藏的档案或目录与 binary 档案: -uuu
  • 使用 -g 指令查找的 glob 。
  • 使用 -t 指定查找档案的类型。
  • 使用 -T 指定排除的档案类型。

参考资料


<<:  33岁转职者的前端笔记-DAY 25 JavaScript 回圈语法笔记

>>:  TailwindCSS 从零开始 - 把重复使用的功能变成元件

Day-13 Excel交叉分析真的很难吗?

今日练习档ԅ( ¯་། ¯ԅ) 今天要与大家分享我所认为较进阶的枢纽分析表应用,也就是「交叉分析数据...

Laravel 实战经验分享 - Day29 剩下最後的两篇,该讲些什麽呢?

到了倒数第二天,一直在想自己该写什麽,在参加这个比赛之前,自己常埋首在自以为是的开发中,无论遇到什麽...

[2021铁人赛 Day10] General Skills 07

引言 昨天学到: tab 键自动补完 unzip ,这个昨天没有仔细讲,但基本使用相当简单,遇到 ...

Unity自主学习(二十七):物件跳跃

那麽今天来试着弄出用"空白建"控制物件跳跃的脚本内容吧! 那之前因为都是平面移动,所以我是想着改变座...

DAY18 专案进度按钮功能实现-2

class Report(): def content(self): flex_message = ...