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

时间:2017-09-29 05:57:28

标签: bash shell readline

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

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

4 个答案:

答案 0 :(得分:4)

试试这个

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' 

答案 1 :(得分:4)

实现此目的的最简单(也可以说是最纯粹和最直观)的方法是执行递归文件fun Activity.b() { this.textView.setText(“”) } ,然后将这些文件结果传输到sed(通过grep)来处理就地替换

xargs
  

关于这个主题有一个全面的community wiki answer,我建议你阅读Unix& Linux交换。

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

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

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

  • 如果您想预览替换结果,请删除-R
  • 如果要预览和汇总文件列表和计数/分配,请添加-l
  • 如果您要备份更改的文件,请添加-K-K -R-RK。{/ li>
  • 忽略案例添加-i,例如-i -x-ix
  • 如果您要使用C++ / C# / Java / Scala 正则表达式语法,请使用-t代替{ {1}}。
  • 过滤文件名称:包括-x,排除-f "\.(xml|java|cpp)$"
  • 过滤目录名称,例如:include --nf "\.(so|a|lib|dll|obj)$",排除-d "src"
  • 使用/或--nd "^(target|\.git)$"
  • 过滤文件大小范围:--s1 1 / --s1 1B
  • 过滤文件的上次写入时间范围,例如:--s2 1.20MB和/或--w1 2017-08-01

有关查找和替换文件或管道的更多用法,请参阅我的打开项目https://github.com/qualiu/msr--w2 "2017-08-12 11:20:30" / msr.exe / msr.gcc*位于msr.cygwin目录中。内置使用和exmaples只需运行exe。文档如performance comparision with findstr and grep