2013-12-10 24 views
2
#!/bin/bash 

t="_tmp" 

for f in $(find . -name '*.java') 
do 

    tf=$f$t #temp file name 
    awk '{gensub("/([_a-zA-Z]*)\.methodName\(\)/", "_newClass.methodCall\(\\1\.newMethodName\(\),\\1\)", "g");}' $f > $tf && mv $tf $f 

done 

基本上我尋找正則表達式使用awk gensub()不匹配

xxx.methodName()

的情況下,並試圖與

_newClass.methodCall(來代替它XXX .newMethodName(),xxx)

其中xxx是在methodName調用之前發生的任何變量名稱。現在我有一個文件,其中包含

"stuff" 
m.methodName() 
"stuff"{m.methodName() 
"stuff" 

並沒有發生任何事情。我哪裏錯了?

回答

2

請嘗試以下awk腳本:

{ 
    print gensub(/([_a-zA-Z]*)\.methodName\(\)/,   \ 
    "_newClass.methodCall(\\1.newMethodName(),\\1)", "g")   
} 

你忘了打印的gensub結果。它不會默認修改$ 0。

+0

謝謝!我注意到我的轉義序列和引號也是關閉的。我很感激幫助。 – user2041602

+0

@ user2041602不客氣。 –

+1

您應該使用'[_ [:alpha:]]'而不是'[_a-zA-Z]'來避免區域設置問題(不要問我是什麼 - 它們存在但我總是使用正確的字符類,所以我不需要考慮它們)。另外,雖然他沒有顯示它,但我懷疑OP可能真的需要'[[:alpha:] _] [[:alnum:] _] *',因爲他似乎在尋找類名,不能爲空,必須以字母或下劃線開頭,並可包含數字。 ''[[:alnum:] _]'可以縮寫爲'\ w',因爲無論如何,如果您關心,那麼您仍在使用gawk。 –