2012-07-30 53 views
4

如何使用sed將源文件中的所有C風格註釋替換爲C++風格。sed替換(單行)C註釋與C++註釋

所有這些:

int main() { 
    /* some comments */ 
    ... 

到:

int main() { 
    // some comments 
    ... 

所有評論都是單線和代碼之間有沒有像這樣:

int f(int x /*x-coordinate*/); 

,所以我想這:

sed -i 's/ \/\* .* \*\/\/\/* /g' src.c 

但它保持文件不變。 This後類似,但我想了解sed的表達式語法。由於「。」匹配任何字符,「*」匹配零個或多個某種模式。我假設「。*」匹配任何數字的任何字符。

+0

這是我第一次聽到名稱「C註釋」和「C++註釋」 – 2012-07-31 09:47:37

回答

5
sed -i 's:\(.*\)/[*]\(.*\)[*]/:\1 // \2:' FILE 

這將改變每一行是這樣的:

aaa /* test */ 

成這樣一行:

aaa // test 

如果你有在同一行更多的評論,你可以將這個更復雜的語法分析器,可以轉換如下行:

aaa /* c1 */ bbb /* c2 */ ccc 

aaa bbb ccc // c1 c2 

sed -i ':r s:\(.*\)/[*]\(.*\)[*]/\(.*\):\1\3 //\2:;tr;s://\(.*\)//\(.*\)://\2\1:;tr' FILE 

一個更復雜的情況是,當你有一行註釋裏面串,就像在call("/*string*/")。這裏是一個腳本c-comments.sed,來解決這個問題:

s:\(["][^"]*["]\):\n\1\n:g 
s:/[*]:\n&:g 
s:[*]/:&\n:g 
:r 
s:["]\([^\n]*\)\n\([^"]*\)":"\1\2":g 
tr 
:x 
s:\(.*\)\n/[*]\([^\n]*\)[*]/\n\(.*\)$:\1\3 // \2: 
s:\(.*\)\n\(.*\)//\(.*\)//\(.*\):\1\n\2 //\4\3: 
tx 
s:\n::g 

保存這個腳本到一個文件c-comments.sed,你這樣稱呼它:

sed -i -f c-comments.sed FILE 
+0

冒號意味着什麼? – xst 2012-07-30 22:13:24

+0

它是一個分隔符。命令's'後面的下一個字符稱爲分隔符,可以是任何字符。例如,如果我需要替換的字符串包含'/',那麼插入'/'作爲分隔符是不好的,因爲在這種情況下,我將不得不用反斜槓引用'/'。在這種情況下,我使用':' – alinsoar 2012-07-30 22:16:31