因此,我想使用一个命令一次更改多个文件。这是我目前所做的:
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 在这方面很棒,下面是整个脚本都用于此目的。