如何在Unix / Linux系统上从命令行recursionsearch和replace

所以我想用一个命令来改变多个文件。 这是我迄今为止:

find -regex ".*\.ext$" | xargs grep -l searchText 2> /dev/null | xargs -i sed 's/searchText/replaceText/' > {}.new 

它能做什么:

我find扩展名为ext的文件,把它发送到grep,忽略错误,然后把它发送到sed,用新文件名file.ext.newreplace。

问题似乎是sed中的redirect>阻止{}被replace为文件名。

有任何想法吗? 还是更好的解决scheme?

如果您可以使用正在更新的文件并创build备份。

 find -name '*.ext' -exec sed -i'.backup' 's/searchText/replaceText/' {} + 

编辑:

如果你绝对不能有这样的文件 – 修改文件的位置和原来的扩展名 – 那么你可以在exec的末尾附加一个额外的命令来移动它们。

反引号aka。 “外部命令”来救援。

 sed -i '.bak' 's/searchText/replaceText/g' `grep -l searchText \`find . -name '*.ext'\`` 

在这里,我们已经find了search'* .ext'然后给文件来searchgrep,这是给sed做的实际replace。 它的优点是它不会为每个find的文件产生新的grep进程。 同上sed。

sed有一个地方选项。

Perl的岩石为此:

找 。  -type f -name'* .ext'|  xargs perl -pi.bak -e's / searchText / replaceText / g'

是的,Perl为此摇滚,这里是一个完整的脚本 。

您可以在Ex模式下使用Vim:

 find -name '*.ext' -exec ex -sc '%s/OLD/NEW/g|x' {} ';' 
  1. %select所有行

  2. s替代品

  3. greplace每一行中的所有实例

  4. 保存并closures