2015-11-13 37 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部分。