2014-04-01 45 views
2

如何使用以下標準工具/腳本替換另一個C函數名稱:shell/awk/grep/python etc?批量替換C中的另一個函數名稱

例如,我需要在整個代碼庫中盲目地用MyAssert(a>b)代替assert(a>b)語句。只有功能名稱需要替換。

+1

如何小心你希望它是什麼? 'printf(「No assert()here \ n」);'? '/ *斷言世界是好的! * /'? –

+0

可以在這裏替換「No assert()\ n」。但是不能取代一個非功能性文本,比如「斷言世界是好的!」 。我需要更換函數名稱,而不用觸摸具有相同名稱的非函數文本。好吧; –

+1

好的;這是理智的。可能你想要在函數名和左括號之間使用一個或多個空格來處理'assert(space

回答

3

您可以使用sed

sed -r 's/\bassert\(a>b\)\b/MyAssert(a>b)/' file 
  • \b查找單詞邊界,使它看起來精確匹配。
  • 這將打印文件到STDOUT,您可以重定向到另一個文件或使用-i選項在現有文件中就地進行更改。
+1

我想你可以通過不匹配'a> b'或左括號來簡化代碼 - 這是一個例子。但是,如果你的'sed'支持用'\ b'擴展正則表達式,這很好。至少,它確保只有自己的單詞'assert'被翻譯,而不是像'test_assertion()'這樣的單詞。 –

2
find . -iname "*.c" -exec sed -i.bak "s/assert/MyAssert/g" {} \; 

這將更改應用於各個.c文件來取代當前目錄下,並創建包含原始一個.c.bak文件。如果你想擺脫這些,你可以用這個刪除:

find . -iname "*.bak" -exec rm {} \; 

當然,要確保你有所有內容的副本第一,我可能會搞砸:-)

如果您想更仔細地追趕的情況下,避免了在另一個單詞中間「斷言」,但得到它在一行的開頭,但它開始變得難看了,仍然是不完美:

find . -iname "*.c" -exec sed -i.bak -e "s/\([^a-zA-Z0-9S]\)assert(/\1MyAssert(/g" -e "s/^assert(/MyAssert(/" {} \; 
+0

我看到'test_assertion()'成爲'test_MyAssertion()'的問題。 –

+0

要修正正則表達式需要更復雜,例如,將其更改爲「s/assert(/ MyAssert(/ g」,它會捕獲'assert(',因此不會影響test_assertion。理想情況下,您希望在a之前檢查角色,但隨後開始變得複雜。如果添加'('適合你,那是最簡單的。 – OldGeeksGuide

1

我編寫了一個Python腳本來解決這個問題。好東西:

  • 它不修改任何不包含字符串的文件。時間戳不會改變,除非文件實際被修改。

  • 你可以調整它只看文件名匹配的模式(如*.c或其他)。

Replace strings in files by Python