我有一些非常长的单行注释:
# 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();
}
对于这个例子(适应其他数字应该是微不足道的)我想要
所以最终看起来像这样:
# 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
或其他东西,它实际会做什么)。
答案 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
是在替换部分中使用代码的替换,匹配部分将替换为从代码返回的值wrap
有三个参数:第一行的前缀,其余行的前缀(在这种情况下,它们几乎相同:注释前缀,我们只需要添加空格到第二个),以及要包装的文本。将输出与您的输出进行比较,无论前导空格如何,您似乎都需要33个字符。如果这是真的,只需删除- length $1
部分。