2016-01-23 55 views
2

我試圖使用unix工具從源文件的大目錄中刪除所有最初的多行註釋。從文件中刪除第一個多行註釋

例如,我有這個文件testfile.c

/* 
    testfile.c 
    get rid of me 
*/ 

int main(int argc, const char *argv[]) { 
/* 
    keep me 
*/ 
    return 0; 
} 


/* 
    keep me 
*/ 

我已經試過用的sed是這樣的:

sed '/\/\*/,/\*\//d' testfile.c 

但剝離導致所有多行註釋:

int main(int argc, const char *argv[]) { 
    return 0; 
} 

有沒有辦法做到這一點,只有刪除多行註釋,如果它開始在非常該文件的第一行,並保留所有其他評論的機智?

+0

你刪除的許可證? – tomc

+0

是的,計劃在完成後將它們放回 – Idr

+0

'^'是起始處發生匹配模式的錨標籤。所以像這樣使用它'/^\/\ * /,/ \ * \ // d' – 2016-01-23 20:00:03

回答

4

這假定在第一個多行註釋前沒有你想要的文件。它只是說,在看到*/結束了第一條評論(然後再也不會停止,無論看到什麼)後開始打印。

$ awk '!f&&/\*\//{f=1;next}f' testfile.c 

int main(int argc, const char *argv[]) { 
/* 
    keep me 
*/ 
    return 0; 
} 


/* 
    keep me 
*/ 

說明:

!f && /\*\// { f=1; next } 

如果標誌f未設置(即,如果f等於0,在程序開始時它),以及當前行包含圖案*/(其中兩個字符都需要用\轉義),然後將標誌設置爲1並立即轉到下一行(不打印)。

f 

打印當前行如果標誌f設置爲1(和回憶,如果是沒有執行next聲明,我們只來到這裏,從而避免了打印的初始註釋的最後一行)。

+0

謝謝!你能解釋一下這種魔法嗎? – Idr

+0

不客氣,補充說明---如果還有什麼不清楚的話請告訴我。 – jas

+1

更簡潔:'awk'f;/* \ // {f = 1}'testfile.c'。 –

0

如果您的意見都最終以同樣的方式 嘗試像

awk 'BEGIN {while($1 != "*/") getline}{print}' 

,否則你將不得不做一些票友看着行的最後兩個字符,直到你找到的第一個註釋的結尾。

這具有在完成任務後不測試任何行的功能。

+0

如果'getline'失敗,會出現其他問題,並且完全不必要使用'getline',這將分解爲無限循環。請參閱http://awk.info/?tip/getline' –

2

與GNU在1,/\*\//{ ... } sed的包裹你的一部分/\/\*/,/\*\//d

sed '1,/\*\//{ /\/\*/,/\*\//d }' file 

輸出:

 

int main(int argc, const char *argv[]) { 
/* 
    keep me 
*/ 
    return 0; 
} 


/* 
    keep me 
*/ 
+0

這也適用。你能解釋一下你添加的'1'部分嗎? – Idr

+0

'1,/ \ * \ // {...}'把sed的動作限制在第一行('1')到第一行加上'* /'(轉義:'\ * \ /')。 – Cyrus

-1
sed '/\/\*/,/\*\// s/.*//g' filename | awk '!/^$/' 
  1. 匹配的模式範圍和無替換所有。
  2. 刪除空行

輸出:

int main(int argc, const char *argv[]) { 
     return 0; 
     } 
+0

這會刪除所有不是OP所需的註釋。 – Idr

+0

是的,我完全正確地閱讀了這個問題 – Sadhun