如何在整个主目录中替换字符串的所有实例?

时间:2016-03-12 00:29:58

标签: posix

我正在图书馆工作,我做了一个重大改变。我的所有项目都导入github.com/retep-mathwizard/utils/src/...,但我已将项目缩短为github.com/retep-mathwizard/utils/...。我需要从~开始查找它的每一次出现,并替换所有出现的事件。有没有办法做到这一点?

2 个答案:

答案 0 :(得分:2)

sed是你的朋友。

$ sed -i 's_github.com/retep-mathwizard/utils/src_github.com/retep-mathwizard/utils_g' *.txt

其中*.txt是您要搜索/替换的任何文本文件。请注意,_很重要。它用于分隔搜索和替换中的模式,因为您的模式中同时具有标准/分隔符和经常使用的替代--i.bak选项会告诉sed编辑文件,并保存扩展名为.bak的备份副本。

如果文件位于多个子目录中,则需要使用findxargs之类的组合。

$ find ~ -name "*.txt" -print0 | xargs -0 sed -i.bak 's_github.com/retep-mathwizard/utils/src_github.com/retep-mathwizard/utils_g' 

同样,*.txt是正则表达式只会找到您要替换文本的文件。

免责声明:与涉及这些工具的任何内容一样,您应首先尝试更换可替换的内容或首先在新的git分支中使用。

编辑:删除了-i标记上的扩展名。正如评论中所指出的,一切都在源代码管理之下,因此在不保存备份文件的情况下进行就地编辑应该没问题。

答案 1 :(得分:1)

此命令查找主目录中的所有文件,减去.git文件夹中的文件:

find ~ -type d -name '.git' -prune -o -type f -print

要用其他东西替换所有实例,我们可以使用sed:

sed 's|\(github\.com/retep-mathwizard/utils/\)src/|\1|g' filename

这会捕获我们想要保留的部分,并在替换中使用它。

结合这些命令来浏览所有文件,使用-i标志进行就地编辑(使用-i ''进行BSD sed / Mac OS) - 我们替换-print操作与-exec sed

find ~ -type d -name '.git' -prune -o -type f \
-exec sed 's|\(github\.com/retep-mathwizard/utils/\)src/|\1|g' {} \;