2016-03-12 119 views
4

我正在开发一个库,并对其进行了重大更改。我的所有项目都导入github.com/retep-mathwizard/utils/src/...,但我已将项目缩短为github.com/retep-mathwizard/utils/...。我需要从~开始找到它的每一处,并替换所有的事件。有没有办法做到这一点?在Git repo的所有文件中搜索并替换文本

回答

3

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标志。正如在评论中指出的那样,一切都在源代码控制之下,所以在没有保存备份文件的情况下进行就地编辑应该没问题。

+0

我的文件都是'.go',而不是'.txt'。它会继续工作吗? – XXXX

+0

当然,只需使用'find〜-name'* .go“...'而不是 – bnaecker

+0

因此,无论我在哪个repo中运行此命令,它都会递归地在它内部的repos中查找它以及这些repos中的文件? – XXXX

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)中–我们与-exec sed更换-print行动:

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

@ mklement0 Aargh,在测试时我确实在我的最后一个版本中有过,但没有转移它。'-type f'在第一个版本中也是必需的,因为默认行为显然是将整个表达式与'-print'进行和运算。 –

+0

事实上(来自[POSIX规范](http://pubs.opengroup.org/onlinepubs/9699919799/utilities/find.html)):“如果给定的表达式不包含任何初始'-exec', -ok'或'-print',给定的表达式应该被'(given_expression)-print'“(在')'和'-print'之间隐含'-a [​​nd]'替换。这意味着你最后不需要'-print'。 – mklement0

+0

@ mklement0如果没有'-print',它会列出没有名为'.git'的目录。 –