2014-09-24 36 views
1

我正在寫一個bash腳本,旨在影響文件夾中的所有文件,以便通過更改參數來替換對給定C函數的所有調用。 這是當前電話是什麼樣子,我想獲得什麼:如何替換C函數調用的整個參數部分?

myfunc(foo) ----> myfunc(foo, foo+1) 

我用下面的查找/ sed命令和它的工作:

find . -name "*" -print | xargs sed -i 's/myfunc\([^)]*)\)/myfunc((\1),(\1)+1)/g' 

但出現時發出我不得不處理指令/參數包含括號,如以下指令:

sqrt(myfunc((foo+foo)*bar)); 

什發生的是第一個右括號(即foo後的一個)被解釋爲myfunc的說法,它是不是結束...

我怎樣才能得到一個正則表達式(或任何其它命令),用以捕捉和替代(foo+foo)*bar,即準確的內容正確的括號水平,無論括號的數量是多少?

+1

http://stackoverflow.com/questions/133601/can-regular-expressions-be-used-to-match-nested-patterns – 2014-09-24 07:44:31

回答

1
sed ':a 
s/myfunc(\([^(]\)(\([^)]*\))/myfunc(\1²\2³/ 
ta 
s/myfunc(\([^)]*\))/myfunc(\1, (\1) + 1)/g 
y/²³/()/ 
' 
  • 試試這個,但它會在第二個myfunc上的遞歸調用(myfunc(1 - myfunc(2)))(通常很少使用)失敗(原樣)),但會在幾個myfunc(非包含ve)在線上。
  • 呈現打開和關閉()都在同一行myfunc
  • POSIX版本(每默認行sed的工作線)(--posix在GNU SED)
  • 使用標記²³如此假設不是在代碼中使用,如果有的話使用其他未使用的字符或預修改並放回。

交代

  • 通過分別²³取代myfunc(後的()任何對等體。 (使用遞歸調用來替換較低級別的較低級別)。最後一個換人後,你有什麼樣myfunc(subfunc2² subfunc3² arg31, arg32³, arg22³)
  • 採取()之間的內容在沒有更多()(哎呀,仍然可以在串有()等等這種情況下,電瓶車)內,並與content, content + 1
  • 更換重置所有²³到repsectively ()

備註:第一輪以改變(與回原來在操作的結束臨時修改)需要爲處於字符串內myfunc() [不是很硬任何()做,但煩人]

+0

謝謝你的回答。你能簡單地解釋命令的機制嗎? – Silverspur 2014-09-25 08:34:21

+0

瞧,添加到帖子(並發現一個限制) – NeronLeVelu 2014-09-25 09:00:12

1

如果你確信你的生產線將只包含myfunc(foo)並沒有更多的)之後,你可以做這樣的貪婪搜索:

myfunc\((.*)\) 

見例如:http://regex101.com/r/gD1mN0/1

+0

將失敗的東西像'myfunc(1)+ myfunc (2)' – NeronLeVelu 2014-09-24 11:10:04

相關問題