2011-07-29 43 views
1

我是C++用戶,並且有一些代碼使用.at()來獲取對STL向量的綁定檢查。現在我想將它們更改爲標準[]。有誰知道可以做到這一點的腳本?它不一定是一個超級通用腳本 - 大多數情況下是.at(i)或可能.at(a*i+j) - 但有太多的手工操作。在我的代碼中用[]代替.at()

+1

有什麼不好'S,\。在\(I \),\ [I \],g'? –

+1

只適用於單個變量名稱。他可能想要使用反向引用的東西。 –

+1

你爲什麼要這樣做?如果爲了提高性能,請在轉換之前和之後檢查一下,如果差值小於20%,我會建議恢復更改 –

回答

6

使用此Perl的操作:

s/\.at\(([^)]+)\)/[$1]/g 

s///運營商在Perl是一種 「替代」(查找/替換)。在第一組//中,指定要匹配的正則表達式。第二個//是替換或替換匹配的文本。

在這種情況下,我發現任何「.at(任何東西但不是關閉的東西)」的實例,並用「[what-in-those-parens]」代替它。

作爲一個內膽,

perl -pe's/\.at\(([^)]+)\)/[$1]/g' in.cpp > out.cpp 

如果您使用Visual Studio,在查找的操作/更換提示:

查找內容:\.at\({[^)]+}\) 替換:\[\1\]

啓用正則表達式,你很好走。

+0

希望你不介意我添加了如何使用s ///。 – ikegami

+0

不,謝謝。改善答案絕不是問題。 – kevlar1818

1
sed -i 's,\.at(\([^\)]*\)),[\1],g' *.h *.cpp 

應該適用於大多數簡單的表達式。但是,如果在參數at()中使用括號,則這不起作用。

grep 'at(.*).*)' *.h *.cpp 

幫助您識別這些情況,並將其轉換運行所述sed腳本之前。

P.S.如果讓sed像這裏一樣在原地進行操作,那麼請保留備份(例如,通過VCS)。

編輯:應該在發佈之前測試過sed腳本。現在修好了,並經過測試。