将长单行注释转换为多个短行

时间:2015-11-13 18:40:11

标签: sed

我有一些非常长的单行注释:

# 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. 每个附加行的缩进与原始行完全相同。
  4. 所以最终看起来像这样:

    # 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脚本,我的尝试看起来像这样(为了清晰起见而忽略了特定字符数的尝试,因为它不起作用):< / p>

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

    这只会破坏一行,而不会像我错误地假设g那样重复(如果它只是s/ /\n/g或其他东西,它实际会做什么)。

1 个答案:

答案 0 :(得分: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部分。