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

sli*_*lel 0 linux find-and-replace recursive

我有一个包含多个子目录的目录,这些子目录都包含文本文件。在这些文本文件中,有一个词反复出现,我想替换每个实例。

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

(作为奖励 - 有没有办法以不区分大小写的方式做到这一点?)

Dav*_*ett 5

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

find /target/directory -type f | xargs perl -pi -e 's/stringtoreplace/replacement/g'
Run Code Online (Sandbox Code Playgroud)

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

find . -type f | xargs perl -pi -e 's/stringtoreplace/replacement/g'
Run Code Online (Sandbox Code Playgroud)

如果您只想替换 html 文件:

find . -type f -name '*html' | xargs perl -pi -e 's/stringtoreplace/replacement/g'
Run Code Online (Sandbox Code Playgroud)

你当然不必使用 perl,任何执行搜索和替换操作的工具都可以,而且毫无疑问,有几个可用的资源比启动 perl 更少(在这种情况下是一个大锤来破解一个坚果,但这是我已经存储多年的一个例子,我没有理由找到更有效的版本)。我的“技巧”的原始来源是http://oreilly.com/pub/h/73

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

  • 您可以在该命令中使用 `sed -i 's/string/replacement/g'` 代替 `perl`。如果您使用 GNU `sed`,只需在 `g` 后添加一个 `i` 以使其不区分大小写。 (4认同)
  • 此外,除非您知道目录中的名称是什么样的,否则您应该真正使用 -print0 参数进行查找,并将 -0 参数用于 xargs。名称中带有回车、空格或制表符的文件可能会给您带来其他问题。 (4认同)