从 Linux 命令行递归替换目录中单词的每个实例

从 Linux 命令行递归替换目录中单词的每个实例

我有一个目录,里面有几个子目录,所有子目录都包含文本文件。在这些文本文件中,有一个单词反复出现,我想替换每个单词。

我的问题 - 如何从 Linux 命令行完成此操作?我不想编辑每个文件并进行手动搜索/替换。

(另外还有一个好处——有没有办法以不区分大小写的方式来做到这一点?)

答案1

您可以使用findperl(通过xargs):

find /target/directory -type f | xargs perl -pi -e 's/stringtoreplace/replacement/g'

或者如果你已经在正确的目录中

find . -type f | xargs perl -pi -e 's/stringtoreplace/replacement/g'

如果你只想替换 html 文件:

find . -type f -name '*html' | xargs perl -pi -e 's/stringtoreplace/replacement/g'

当然,您不必使用 perl,任何执行搜索和替换操作的工具都可以,而且毫无疑问,有几种可用的工具比启动 perl 消耗的资源更少(在这种情况下,启动 perl 是件难事,但这是我储存了很久的例子,我没有理由去寻找更高效的版本)。我最初关于这个“技巧”的来源是http://oreilly.com/pub/h/73

您可以在所选的任何工具中使用所有选项,因此在这种情况下,Perl 正则表达式的强大功能得以充分发挥。上面链接的页面有更多示例,包括如何以不区分大小写的方式进行搜索。

答案2

从您的处理来看,我相信您可能对使用 GNU Parallel 的解决方案感兴趣 http ://www.gnu.org/software/parallel/

find /target/directory -type f | parallel perl -pi -e 's/stringtoreplace/replacement/ig'

此解决方案并行执行替换,并且不区分大小写。GNU Parallel 不存在分隔符问题 http ://en.wikipedia.org/wiki/Xargs#The_separator_problem - 仅当您的文件名包含换行符时,您才需要 -print0/-0 组合。

观看 GNU Parallel 的介绍视频:http://www.youtube.com/watch?v=OpaiGYxkSuQ

相关内容