2015-11-13 41 views
0

我有很長的單行一些行的註釋:轉換長的單行註釋成多短線

# this is a comment describing the function, let's pretend it's long. 
function whatever() 
{ 
    # this is an explanation of something that happens in here. 
    do_something(); 
} 

在這個例子中(它適應其他數字應該是微不足道的),我想

  1. 每行的最大數量爲33個字符(每個凹口電平爲4位)和
  2. 到在最後可能的空間
  3. 每個附加線被打破不被縮進EXAC像原始線一樣。

所以它最終會看起來像這樣:

# this is a comment describing 
# the function, let's pretend 
# it's long. 
function whatever() 
{ 
    # this is an explanation of 
    # something that happens in 
    # here. 
    do_something(); 
} 

我試圖寫一個腳本sed,我試圖尋找這樣的(而忽略了試圖使其在打破特定字符計數的清晰度和因爲它沒有工作):

s/\(^[^#]*# \)\(.*\) \(.*\)/\1\2\n\1\3/g; 

這破壞了行只有一次,不重複像我錯認爲g做(和它,如果它是在實際上會做或者其他什麼)。

回答

0

Perl來拯救!

Text::Wrap模塊做你所需要的:

perl -MText::Wrap='wrap,$columns' -pe ' 
    s/^(\s*#)(.*)/$columns = 33 - length $1; wrap("$1", "$1 ", "$2")/e 
    ' <input> output 
  • -M使用具有給定參數指定的模塊。在這裏,我們將使用wrap函數和$columns變量。
  • -p由線讀取輸入線,並打印可能修改的線(如sed
  • s///e是使用代碼在更換部分的取代,所述匹配部被從代碼
  • 返回的值替換
  • 來計算寬度,我們從33中減去最初的空格。如果你在源代碼中使用了標籤,你將不得不專門處理它們。
  • wrap有三個參數:第一行的前綴,其餘行的前綴(在這種情況下,它們幾乎相同:註釋前綴,我們只需要將空間添加到第二行);和要包裝的文字。

比較你的輸出,看起來你需要33個字符,而不管前導空格。如果這是真的,只需刪除- length $1部分。