0

我有这样的评论(几个例子):

  1. //========================================================================
    // some text some text some text some text some text some text some text 
    
  2. //========================================================================
    // some text some text some text some text some text some text some text some text
    // some text some text
    // (..)
    

我想用这种风格的评论替换它:

/*****************************************************************************\

Description:

    some text some text
    some text some text some text

\*****************************************************************************/

所以我需要正则表达式。我设法制作了这个正则表达式:

//=+\r//(.+)+

它匹配组中的注释,但只有一行(示例 1)。如何使它与多行注释一起工作(如示例 2)?

感谢帮助

4

4 回答 4

1

使用 sed:

sed -n '
  \_^//==*_!p;
  \_^//==*_{
    s_//_/*_; s_=_\*_g; s_\*$_\*\\_;
    h; p; i\
Desctiption:
    : l; n; \_//[^=]_{s_//_\t_;p;};t l;
    x;s_^/_\\_;s_\\$_/_;p;x;p;
  }
  ' input_file

评论版本:

sed -n '
  # just print non comment lines
  \_^//==*_!p;
  # for old-style block comments:
  \_^//==*_{
    # generate header line
    s_//_/*_; s_=_\*_g; s_\*$_\*\\_;
    # remember header, add description
    h; p; i\
Desctiption:
    # while comment continues, replace // with tab
    : l; n; \_//[^=]_{s_//_\t_;p;};t l;
    # modify the header as footer and print
    x;s_^/_\\_;s_\\$_/_;p
    # also print the non-comment line
    x;p;
  }
  ' input_file
于 2012-08-23T14:23:50.573 回答
0

这个正则表达式匹配整个评论

(\/\/=+)(\s*\/\/ .+?$)+
于 2012-08-23T13:05:14.930 回答
0

一个简短的 perl 脚本,应该可以满足您的需要,在评论中进行了解释:

#!/usr/bin/perl -p

$ast = '*' x 75;                  # Number of asterisks.
if (m{//=+}) {                    # Beginning of a comment.
    $inside = 1;
    s{.*}{/$ast\\\nDescription:};
    next;
}
if ($inside) {
    unless (m{^//}) {             # End of a comment.
        undef $inside;
        print '\\', $ast, "/\n" ;
    }
    s{^//}{};                     # Remove the comment sign for internal lines.
}
于 2012-08-23T13:10:28.623 回答
0

如果仍然需要正则表达式,不知道是否有更好的解决方案,这就是我想出的:

(?<=\/{2}\s)[\w()\.\s]+

应该得到所有感兴趣的文本。

于 2012-08-23T13:45:33.477 回答