如何在 unix/linux 系统上从命令行进行递归搜索和替换

如何在 unix/linux 系统上从命令行进行递归搜索和替换

因此,我想使用一个命令一次更改多个文件。这是我目前所做的:

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

它能做什么:

我找到扩展名为 ext 的文件,将其发送给 grep 并忽略错误,然后将其发送给 sed 以用新文件名 file.ext.new 进行替换。

问题似乎是 sed 中的重定向 > 阻止用文件名替换 {}。

有什么想法吗?或者更好的解决方案?

答案1

如果您可以接受文件在原地更新并且创建备份。

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

编辑:

如果您实在无法以这种方式获得文件 - 修改后的文件保留在原处并且​​原始文件带有扩展名 - 那么您可以在 exec 的末尾添加一个额外的命令来移动它们。

答案2

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

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

这里我们用 find 搜索 '*.ext',然后将其作为要搜索的文件提供给 grep,然后交给 sed 进行实际替换。它的优点是它不会为找到的每个文件生成新的 grep 进程。sed 也是如此。

答案3

sed 有一个 --in-place 选项。

答案4

是的,Perl 在这方面很棒,下面是整个脚本都用于此目的

相关内容