2011-03-03 76 views
2

我試圖寫一個sed命令,允許我修改函數的參數。參數的數量可以是可變的。sed:修改函數參數

如果這是我的函數:

int myFunction(int arg1, int arg2, Dog arg3) { 
    // function implementation 
} 

我希望能夠在INT ARG1,ARG2 INT,執行加法運算......

這裏是我已經不工作:

sed -e '/^[a-zA-Z0-9_]\+\s\+[a-zA-Z0-9_]\+(/ , /)[\n\s]*{/ { 
    # arguments should be listed here 
}' 

任何幫助表示讚賞。對我來說很容易,這是我第一次嘗試sed/shell腳本。

謝謝。

+1

如果它是一個可變數量的參數,你無法單獨用正則表達式解決這個問題。你至少需要一個[上下文無關文法](http://en.wikipedia.org/wiki/Chomsky_hierarchy#The_hierarchy),或者一個黑客。 – Flexo 2011-03-03 09:04:09

回答

1

最終,sed不是此作業的正確工具 - 因爲您對'參數數量可變'的評論。如果你正在處理一個固定類型的固定數量的參數,你可以繞過它,但是更常規的處理需要更通用的處理器(比sed)。

我建議嘗試一個不同的任務,因爲您對shell腳本和sed的介紹。

如果你必須這樣做,那麼也許:

sed '/^[A-Za-z_][A-Za-z0-9_]* *[A-Za-z_][A-Za-z0-9]* *([A-Za-z_][A-Za-z0-9_]* *\([A-Za-z_][A-Za-z0-9_]*\) *, *[A-Za-z_][A-Za-z0-9_]* *\([A-Za-z_][A-Za-z0-9_]*\)[ ,)].*{/{p;a\ 
    return \1 + \2; 
}' $file 

比賽的那部恐怖含有序列[A-Za-z_][A-Za-z0-9_]* 6倍;它每次都匹配一個標識符。 '[ ,)].*{中的分段與第三個或其後的參數匹配。模式中的空格可能應該是'[<blank><tab>]'字符類,但是在StackOverflow上輸入卻很痛苦。正則表達式,然後匹配函數的定義,並獲取(在「\(<identifier>\)」部分的兩個變量(在你的榜樣arg1arg2)的行動時,這是公認的名稱是:

  1. p - 打印
  2. a - 將以下行添加到輸出中;在這種情況下,一行包含一個返回語句,該語句是兩個記憶參數名稱的總和,反斜線表示存在另一行的大括號將操作組合在一起。

某些版本的sed支持比其他版本更強大的正則表達式;我不確定,即使GNU sed支持PCRE(Perl兼容正則表達式),也需要像PCRE那樣來顯着減少正則表達式。

請注意,此腳本不會改變註釋行'// function implementation'。這是你的電話你做了什麼。

最後,請記住,如果您編寫多個函數來將兩個整數相加,則會浪費代碼。因此,這不是一個合理的轉變。不知何故,每個功能應該做一些不同的事情。當然,如果類型每次都不相同,那麼它可能有其用途,但即便如此,編寫生成器也比分析骨架並填充位更容易。這可能是一個很好的腳本練習。

+1

您可以使用'[[:blank:]] *'。超級sed('ssed')支持PCRE。另外,你應該指出''sed'不會做多行正則表達式匹配,因爲OP試圖匹配'///'的LHS上的換行符。你必須使用保持空間和/或分支來編寫一個'sed'腳本。我認爲「額外」可能是有意的而不是「增加」。 – 2011-03-03 16:11:41

+0

@Dennis:POSIX'sed'確實允許'[[:blank:]]'表示法 - 我在學習之前學會了'sed',所以我傾向於忘記它們。你的換行符只強調了'sed'不是這份工作的正確工具。而你把'addition'解釋爲'additional'很可能是正確的,並且再次強調'sed'不是工作的工具。所以,我同意你的所有評論。 – 2011-03-03 16:20:33