2017-09-05 65 views
1

我需要在linux下使用sed刪除C程序中的註釋行,假設每個註釋行包含開始和結束標記,而前後沒有任何其他語句。SED刪除C程序註釋

例如,下面的代碼:

/* a comment line in a C program */ 
printf("It is /* NOT a comment line */\n"); 
x = 5; /* This is an assignment, not a comment line */ 
[TAB][SPACE] /* another empty comment line here */ 
/* another weird line, but not a comment line */ y = 0; 

成爲

printf("It is /* NOT a comment line */\n"); 
x = 5; /* This is an assignment, not a comment line */ 
/* another weird line, but not a comment line */ y = 0; 

我知道,這正則表達式

^\s?\/\*.*\*\/$ 

,我需要刪除線相匹配。但是,下面的命令:

sed -i -e 's/^\s?\/\*.*\*\/$//g' filename 

沒有辦法。

我不太確定我在做什麼錯...

感謝您的幫助。

+0

您應該在您的示例中包含'/ *第一條評論* /非評論/ *第二條評論* /',因爲sed腳本難以正確處理。你現有的答案都不能正確處理,他們都認爲這是一條評論線。 –

+0

https://unix.stackexchange.com/questions/297346/how-can-i-delete-all-characters-falling-under-including – bishop

回答

2

該做的:

$ sed -e '/^\s*\/\*.*\*\/$/d' file 
printf("It is /* NOT a comment line */\n"); 
x = 5; /* This is an assignment, not a comment line */ 
/* another weird line, but not a comment line */ y = 0; 

注:

  1. ^\s?匹配零個或一個空格。看起來你想匹配零個或一個或多個空間。所以,我們使用^\s*

  2. 由於您要刪除行而不是用空行替換它們,因此要使用的命令是d進行刪除。

  3. 沒有必要用/分隔正則表達式。我們可以用|,例如:

    sed -e '\|^\s*/\*.*\*/$|d' file 
    

    這樣就不必爲了躲避/。根據/在正則表達式中出現的次數,這可能會也可能不會更簡單和更清晰。

0

你在做什麼與空字符串

sed -i -e 's/^\s?\/\*.*\*\/$//g' filename 

這意味着

sed -i -'s/pattern_to_find/replacement/g' : g means the whole file. 

你需要做的更換您的正則表達式是刪除該行與正則表達式

sed -i -e '/^\s?\/\*.*\*\/$/d' filename 
1

這可能是你l ooking爲:

$ awk '{o=$0; gsub(/\*\//,"\n"); gsub(/\/\*[^\n]*\n/,"")} NF{print o}' file 
printf("It is /* NOT a comment line */\n"); 
x = 5; /* This is an assignment, not a comment line */ 
/* another weird line, but not a comment line */ y = 0; 
/* first comment */ non comment /* second comment */ 

以上在此輸入文件運行:

$ cat file 
/* a comment line in a C program */ 
printf("It is /* NOT a comment line */\n"); 
x = 5; /* This is an assignment, not a comment line */ 
    /* another empty comment line here */ 
/* another weird line, but not a comment line */ y = 0; 
/* first comment */ non comment /* second comment */ 

,並使用awk的,因爲一旦你過了一個簡單的S /老/新/萬物容易(和更有效,更便攜等)與awk。以上將刪除任何空行 - 如果這是一個問題,然後更新您的示例輸入/輸出,以包括它,但這是一個簡單的修復。