2015-12-21 21 views
0

在文件sedd無法刪除multliline註釋中使用的sed

/* This program read two integer numbers from the 
    keyboard and prints their product. 
       written by: 
       Date: 
*/ 

/*    statements */ 
    scanf ("%d",&number1); 
    scanf ("%d",&number2); 
    result = number1 * number2; 
    printf ("%d",result); 
    return 0; 
} /* main */ 

命令:

sed -f sedd.sed sedd 

其中sedd.sed是:

/^\/\*/,/^\*\/$/{ d 
} 

desired output

scanf ("%d",&number1); 
    scanf ("%d",&number2); 
    result = number1 * number2; 
    printf ("%d",result); 
    return 0; 
} 

我用sedd.sed作爲

$a\ 
\} 

/^\/\*/,5{ 
d 
} 

/^\/\*.*\*\//d 
/\/\*.*\*\//d 

我不明白爲什麼(下同)打破了代碼?我相信,正則表達式的範圍並沒有向前移動模式空間。

/^\/\*/,/^\*\/$/{ d 
} 
+1

適用於Mac OS X(BSD)'sed'。大括號確實沒有必要(只需在行的範圍後面加上'd'),但它們也不會損壞。如果問題出在註釋後面的數據被移除,問題將出現在'* /'末尾註釋行上的尾部素材(空格或製表符)。你在哪個平臺上?這個文件有什麼特別的地方嗎?你用'od -c'還是十六進制轉儲來看它?您是否嘗試通過將此問題的評論複製並粘貼到全新文件中,然後在該文件上運行命令來重新創建文件? –

+0

感謝您的回覆。請參閱更新,因爲我錯過了在代碼中添加額外的行。 – asad

+0

有什麼問題?新文件得到的評論比你想要的更多,但這是因爲你沒有處理所有可能的評論配置。你需要寫一個更仔細的腳本。你想用單行註釋完成什麼?換成空白?留下一個?你應該真的顯示你得到的輸出和你想得到的輸出,但是你的正則表達式「起作用」,即使你不打算按照你要求的做法。 –

回答

1

試試這個:

sed '/^\/\*/,/^\*\//d' file 

如果你想編輯與GNU文件 「到位」 添加選項-i sed的。

+0

對不起,我忘了添加完整的行,看更新問題。 – asad

+0

我不知道它是否相關,但問題最初有腳本標記爲引用文本,而反斜槓是不可見的。當顯示爲「代碼」時,反斜槓是可見的,並且與您擁有的幾乎相同。 –

+0

@JonathanLeffler:謝謝你提供這些信息。 – Cyrus

0

我不清楚爲什麼你要在最後加上},所以這個腳本沒有,但是你可以很容易地將它添加回你的腳本。

此腳本不是通用的C語言分析器。但它確實解決您的輸入(但不是我):

s%/\*.*\*/% %g 
/^\/\*/,/^\*\/$/ d 

第一行或多或少涉及單行註釋,只要他們不是太複雜(如嵌入一個字符串中文字或多字符常量,或者在單行上有幾個這樣的註釋)。第二個是你原來的多行註釋解析器。它的約束條件是可以的,其中之一就是它不會檢測到一般性評論 - 只有那些從第1列開始,並在評論結束標記中完成的整體評論。

爲您輸入的這個擴展版本:

blurble 
flup 
/* This program read two integer numbers from the 
    keyboard and prints their product. 
       written by: 
       Date: 
*/ 
fangdoodle 
wotsit 

/* This program read two integer numbers from the 
    keyboard and prints their product. 
       written by: 
       Date: 
*/ 

int main(void) 
{ 

/*    statements */ 
    scanf ("%d",&number1); 
    scanf ("%d",&number2); 
    result = number1 * number2; 
    printf ("%d",result); 
    return 0; 
} /* main */ 

char /*far*/*deviousness(/*const*/ char *str) 
{ 
    enum { MASSIVE = 128 }; 
    char *result = malloc(MASSIVE); 
    char cmp[] = "/* not a comment */"; 
    for (int i = '/*'; i < '*/'; i++) 
     printf("%d\n", i); /* Note 
           this is not deleted */ 
    snprintf(result, MASSIVE, "%s%s%s %s", "/*", str, "*/", cmp); 
    return result; 
} 

/* 
* This style of comment 
* is not handled properly. 
*/ 
char *maliciously(char *deleted) 
{ 
    return deleted + 4; 
} 

/* Oh why? 
*/ 

whooptido! 

輸出是:

blurble 
flup 
fangdoodle 
wotsit 


int main(void) 
{ 


    scanf ("%d",&number1); 
    scanf ("%d",&number2); 
    result = number1 * number2; 
    printf ("%d",result); 
    return 0; 
} 

char char *str) 
{ 
    enum { MASSIVE = 128 }; 
    char *result = malloc(MASSIVE); 
    char cmp[] = " "; 
    for (int i = ' '; i++) 
     printf("%d\n", i); /* Note 
           this is not deleted */ 
    snprintf(result, MASSIVE, "%s%s%s %s", " ", cmp); 
    return result; 
} 


whooptido! 

試圖用精確到sed消除空調風格的評論是非常,非常努力。對於簡單的情況,你可以或多或少地處理它,但是正確地完成這項工作,識別字符串和字符等是非常困難的。這就是你進入像惡評前:

/\ 
\ 
* This *\ 
\ 
//??/ 
* Trigraphs are going to go from C++17 *??/ 
??/ 
/

憐貧編譯器作家誰必須確保他們的編譯器並妥善處理這樣的廢話。