繁体   English   中英

如何从命令行进行递归查找和替换?

[英]How to do a recursive find and replace from the command line?

是否有一种简单的方法可以递归搜索目录层次结构中的所有文件(例如port ),并将该术语的所有匹配项替换为另一个(例如port-lookup )。

我已尝试过这篇文章中的建议,但它们仅适用于单个文件。

尝试这个

find ./ -type f -exec sed -i -e 's/port/port-lookup/g' {} \;

如果您不想更改文件修改时间

grep -rl 'port' /search_in_this_dir | xargs sed -i 's/port/port-offset/g' 

实现此目的的最简单(也可以说是最纯粹和最直观)的方法是执行递归文件grep然后将这些文件结果传递给sed(通过xargs )来处理就地替换。

grep -r -l "port" | xargs -r -d'\n' sed -i 's/port/port-lookup/g'

关于这个主题有一个全面的社区wiki答案 ,我建议你阅读Unix和Linux交换。

如果您有最新版本的bash(> 4)

shopt -s globstar
sed -i 's/port/port-lookup/g' **/*

只需1个命令行: msr -rp dir1,dir2,file1,fileN -x port -o port-lookup -R

上面的命令重复搜索并将纯文本port替换为文件中的port-lookup

  • 如果要预览替换结果 ,请删除-R
  • 如果要预览和汇总文件列表和计数/分布,请添加-l
  • 如果要备份更改的文件,请添加-K-K -R-RK
  • 忽略大小写添加-i-i -x-ix
  • 如果要使用C++ / C# / Java / Scala Regex语法,请使用-t而不是-x
  • 过滤文件名如:include -f "\\.(xml|java|cpp)$" ,exclude --nf "\\.(so|a|lib|dll|obj)$"
  • 过滤目录名称如:include -d "src" ,exclude --nd "^(target|\\.git)$"
  • 过滤文件大小范围如: - --s1 1 / --s1 1B with /或--s2 1.20MB
  • 过滤文件的最后写入时间范围如下: - --w1 2017-08-01 with /或--w2 "2017-08-12 11:20:30"

关于查找和替换文件或管道更多的用途只是看到我打开的项目https://github.com/qualiu/msrmsr.exe / msr.gcc* / msr.cygwin是在tools目录)。 内置使用和exmaples只需运行exe。 Docs findstrgrep的性能比较

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM