所以我想用一个命令来改变多个文件。 这是我迄今为止:
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' {} ';'
%select所有行
s替代品
greplace每一行中的所有实例
保存并closures