2 个不稳定版本

0.1.0 2022 年 1 月 6 日
0.0.1 2021 年 12 月 29 日

#2782 in 命令行工具

GPL-3.0-or-later

46KB
1K SLoC

fnr – 查找和替换

类似于 find ... | xargs sed ...,但具有易于记忆的界面。

递归地在文件和目录中查找和替换模式。

fnr [OPTIONS] FIND REPLACE [PATH...]

关于

fnr 设计成比 sed 更直观,但不是直接的替代品。相反,它专注于在目录中执行批量更改,并且更类似于您的 IDE 或编辑器的查找和替换工具。

fnr 为 alpha 质量。 不要在无法回滚的情况下使用 --write

示例

在当前目录中将 "old_function" 替换为 "new_function"

fnr old_function new_function

选择要考虑的文件和目录。

fnr 'EDITOR=vim' 'EDITOR=emacs' ~/.zshrc ~/.config/

我们可以使用 --literal 使模式不被视为正则表达式。

fnr --literal 'i += 1' 'i++'

使用捕获组进行替换。

fnr 'const (\w+) = \d+;' 'const $1 = 42;'

使用 -W --write 将更改写回文件。

fnr --write 'Linus Torvalds' 'Linux Torvalds'

使用 -I --include 仅修改与模式匹配的文件或目录。

fnr --include 'Test.*\.kt' 'mockito' 'mockk'

类似地,使用 -E --exclude 忽略某些文件。

fnr --exclude ChangeLog 2021 2022

要考虑的文件和目录也可以通过标准输入提供。

find /tmp/ -name "*.csv" -print | fnr "," "\t"

使用 -p --prompt 逐个接受或拒绝每个替换。

fnr --prompt --literal 'i++' '++i'
--- ./README.md: 2 matching lines
-   18: $ fnr --literal 'i += 1' 'i++'
+   18: $ fnr --literal 'i += 1' '++i'
Stage this replacement [y,n,q,a,e,d,?] ?

安装

cargo install fnr

如果您更愿意从源代码构建

$ git clone [email protected]/erik/fnr.git
$ cd fnr
$ cargo install --path .

性能

建立在 ripgrep 的路径遍历和模式匹配之上,因此尽管性能不是明确的目标,但也不会成为瓶颈。

事实上,如果不将更改写回文件,它的速度比 ripgrep 本身几乎感觉不到慢。

命令 平均 [ms] 最小 [ms] 最大 [ms] 相对
rg"EINVAL" ./linux 510.4 ± 25.8 467.6 555.0 1.00
fnr"EINVAL" "ERR_INVALID" ./linux 620.4 ± 22.1 573.7 649.7 1.22 ± 0.08
fnr--write"EINVAL" "ERR_INVALID" ./linux 3629.0 ± 76.2 3538.0 3802.3 7.11 ± 0.39
ag"EINVAL" ./linux 2560.0 ± 43.6 2518.4 2668.1 5.02 ± 0.27
grep-irI"EINVAL" ./linux 37215.8 ± 7444.7 31316.1 49096.6 72.92 ± 15.04

相似工具

如果 fnr 并不完全符合您的需求,还可以考虑

依赖项

~12–23MB
~388K SLoC