2017-03-02 137 views
0

我想刪除文件中字符串/**/之間的所有文本,其中字符串可能出現在不同的行上並圍繞註釋。比如我想刪除它包含/**/之間的以下七行:sed刪除不同行上兩個字符串之間的字符

/* "CyIHTAlgorithm.pyx":81 
* @cython.wraparound(False) 
* @cython.cdivision(True) 
* cdef inline object IHTReconstruction2D(fType_t[:,:] data,    # <<<<<<<<<<<<<< 
*       fType_t[:,:] residualFID, 
*       fType_t[:,:] CS_spectrum, 
*/ 

我設法在弦上的同一行發生做到這一點使用的sed: sed -i.bak 's/\(\/\*\).*\(\*\/\)/\1\2/' test.txt 但我不知道如何該在同一個文件擴展到多行:

我也曾嘗試: sed -i.bak '/\/\*/{:a;N;/\*\//!ba;s/.*\/\*\|\*\/.*//g}' test.txt以下的想法在這裏(Extract text between two strings on different lines

這種德 - 在開頭處輸入/*,而輸入*/但不輸入中間文字。

+0

看看你的sed的版本有'-z'選項,這將允許NUL是行分隔符,而不是換行... – Sundeep

+0

相關http://stackoverflow.com/questions/13061785/remove-多行註釋 –

+0

如果您知道在評論開始或結束時同一行中沒有非評論代碼,這並不難,但對於一般情況而言,這更加痛苦。 –

回答

0

你可以使用sed或cut,但它們確實是爲模式設計的,所以每一行都應該匹配它。 您應該通過獲取開始和結束的木材線來聲明第一行和最後一行,然後您可以將其包裝到函數中。

所以, 1)獲得的行號/ *部分 2)獲得*/ 3的最後一行數字)你可以使用「而讀線;」使用cut或sed循環並剪切每一行。

0

awk真的更適合這種事情。它的supports/pattern/,/pattern2/語法的開箱即用。

awk '/[:space:]*\/\*/,/[:space:]*\*\// {next} {print}' file.txt

它的工作方式如下:在兩種模式之間的界限則執行{next}實際上跳過線,其他一切只是打印輸入。

+0

這給我一個語法錯誤。你還可以解釋這裏的語法是如何工作的嗎? – 218

+0

初始命令中的else語句實際上存在錯誤。現在應該沒問題。 – mshrbkv

2

爲什麼不使用sed範圍?

$ cat tmp/file13 
first line 
/* "CyIHTAlgorithm.pyx":81 
* @cython.wraparound(False) 
* @cython.cdivision(True) 
* cdef inline object IHTReconstruction2D(fType_t[:,:] data,    # <<<<<<<<<<<<<< 
*       fType_t[:,:] residualFID, 
*       fType_t[:,:] CS_spectrum, 
*/ 
before last line 
last line 

$ sed '/\/\*/,/\*\//d' tmp/file13 
first line 
before last line 
last line 
0

以下將嘗試做更多,所以先測試它是否適合您的需求。

cpp -P test.txt 
相關問題