2 个不稳定版本
0.1.0 | 2022 年 1 月 6 日 |
---|---|
0.0.1 | 2021 年 12 月 29 日 |
#2782 in 命令行工具
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
并不完全符合您的需求,还可以考虑
- facebookincubator/fastmod - 与
fnr
相当相似。 - google/rerast - 在 Rust AST 上操作
- coccinelle - 对 C 代码进行更高级的编辑
- ... 许多更多
依赖项
~12–23MB
~388K SLoC