2016-03-12 116 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'的目錄。 –