grep
是查找档案中内容的指令,在一般的作业情境下, grep
的功能是十分足够了,但是在开发作业时, grep
的某些预设就显得比较不合需求,例如只针对特定档案、不会显示行数与不会排除 .gitignore
中忽略的档案等。虽然大部分的功能都可以藉由特定的参数设定完成,但是多了参数就多了需要记忆的部分,也比较不直觉,因此使用一个专为开发设计的查找内容工具是个提升产能的方式。
ripgrep
提供使用者直觉的内容查找指令,利用直观的使用方式,我们可以轻松无负担的找到需要的资料。
它有下面的特色:
.gitignore
,会将其所设定的范围排除在搜寻外,并会自动忽略隐藏档案与 binary 。grep
的功能,像是显示结果的上下文、搜寻多个 patterns 、搜寻字串的高亮等。使用 Homebrew 安装 ripgrep
:
brew install ripgrep
安装完成後,就可以使用 rg
指令叫用 ripgrep
了。
rg --help
--help
参数会列出说明供使用者参照。
rg
的使用需要带有 PATTERN
参数,这就是搜寻的目标。
rg ripgrep
上例的 ripgrep
就是 PATTERN
参数,这个指令会去查找当前目录下所有档案内容中有 ripgrep
的结果。
如果想要搜寻特定档案,可以使用第二个参数指定档案。
rg ripgrep README.md
上例只会查找 README.md
中的内容。
ripgrep
支援正规表达式的搜寻方式,因此你可以使用正规表达式的语法设定搜寻的 PATTERN
。
rg ' rip\w+'
上例会搜寻 rip
字串前面是空白,并且後面接一个以上字元的结果。
关於正规表达式的设定方式,可以参考 Docs.rs 的文件。
上面就是 ripgrep
主要的使用方式,接下来会介绍几个常用的搜寻情境供使用者参考。
ripgrep
的搜寻会依照对应的规则忽略特定的档案,如果在搜寻时,遇到下面的情况,会对其做忽略的动作:
.gitignore
(全域及本地)。.ignore
,如果与 .gitignore
冲突,会以 .ignore
为先。.rgignore
,如果与 .ignore
冲突,会以 .rgignore
为先。ripgrep
用 NUL
判断是否为 binary )。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
预设搜寻时会忽略部分档案,其忽略的范围如下:
--no-ignore
与 -u
。--hidden
。--text
。--follow
。-uu
。-uuu
。-g
指令查找的 glob 。-t
指定查找档案的类型。-T
指定排除的档案类型。
<<: 33岁转职者的前端笔记-DAY 25 JavaScript 回圈语法笔记
>>: TailwindCSS 从零开始 - 把重复使用的功能变成元件
今日练习档ԅ( ¯་། ¯ԅ) 今天要与大家分享我所认为较进阶的枢纽分析表应用,也就是「交叉分析数据...
到了倒数第二天,一直在想自己该写什麽,在参加这个比赛之前,自己常埋首在自以为是的开发中,无论遇到什麽...
引言 昨天学到: tab 键自动补完 unzip ,这个昨天没有仔细讲,但基本使用相当简单,遇到 ...
那麽今天来试着弄出用"空白建"控制物件跳跃的脚本内容吧! 那之前因为都是平面移动,所以我是想着改变座...
class Report(): def content(self): flex_message = ...