如何使用以下標準工具/腳本替換另一個C函數名稱:shell
/awk
/grep
/python
etc?批量替換C中的另一個函數名稱
例如,我需要在整個代碼庫中盲目地用MyAssert(a>b)
代替assert(a>b)
語句。只有功能名稱需要替換。
如何使用以下標準工具/腳本替換另一個C函數名稱:shell
/awk
/grep
/python
etc?批量替換C中的另一個函數名稱
例如,我需要在整個代碼庫中盲目地用MyAssert(a>b)
代替assert(a>b)
語句。只有功能名稱需要替換。
您可以使用sed
sed -r 's/\bassert\(a>b\)\b/MyAssert(a>b)/' file
\b
查找單詞邊界,使它看起來精確匹配。-i
選項在現有文件中就地進行更改。我想你可以通過不匹配'a> b'或左括號來簡化代碼 - 這是一個例子。但是,如果你的'sed'支持用'\ b'擴展正則表達式,這很好。至少,它確保只有自己的單詞'assert'被翻譯,而不是像'test_assertion()'這樣的單詞。 –
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(/" {} \;
我看到'test_assertion()'成爲'test_MyAssertion()'的問題。 –
要修正正則表達式需要更復雜,例如,將其更改爲「s/assert(/ MyAssert(/ g」,它會捕獲'assert(',因此不會影響test_assertion。理想情況下,您希望在a之前檢查角色,但隨後開始變得複雜。如果添加'('適合你,那是最簡單的。 – OldGeeksGuide
我編寫了一個Python腳本來解決這個問題。好東西:
它不修改任何不包含字符串的文件。時間戳不會改變,除非文件實際被修改。
你可以調整它只看文件名匹配的模式(如*.c
或其他)。
如何小心你希望它是什麼? 'printf(「No assert()here \ n」);'? '/ *斷言世界是好的! * /'? –
可以在這裏替換「No assert()\ n」。但是不能取代一個非功能性文本,比如「斷言世界是好的!」 。我需要更換函數名稱,而不用觸摸具有相同名稱的非函數文本。好吧; –
好的;這是理智的。可能你想要在函數名和左括號之間使用一個或多個空格來處理'assert(space