所以我想用一个命令同时更改几个文件。这是我到目前为止所拥有的:
find -regex ".*\.ext$" | xargs grep -l searchText 2> /dev/null | xargs -i sed 's/searchText/replaceText/' > {}.new
它能做什么:
我找到扩展名为 ext 的文件,将其发送到 grep 忽略错误,然后将其发送到 sed 以替换为新文件名 file.ext.new。
问题似乎是 sed 中的重定向 > 阻止 {} 被文件名替换。
有任何想法吗?还是更好的解决方案?
如果您可以忍受正在更新的文件并创建备份。
编辑:
如果您绝对不能以这种方式获得文件 - 修改后的文件和原始文件带有扩展名 - 那么您可以在 exec 的末尾添加一个额外的命令来移动它们。
反引号又名。“外部命令”来救援。
在这里,我们找到搜索“*.ext”,然后将其作为文件提供以搜索 grep,这些 grep 是给 sed 的,它进行实际替换。它的优点是它不会为找到的每个文件生成新的 grep 进程。sed 同上。
sed 有一个 --in-place 选项。
Perl 对此非常满意:
是的,Perl 很适合这个,这里有一个完整的脚本。
你可以在 Ex 模式下使用 Vim:
%
选择所有行s
代替g
替换每行中的所有实例x
保存并关闭