旧版评论的正则表达式

时间:2012-08-23 12:53:00

标签: regex sed grep

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

  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
    // (..)
    
  3. 我想用这种风格的评论替换它:

    /*****************************************************************************\
    
    Description:
    
        some text some text
        some text some text some text
    
    \*****************************************************************************/
    

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

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

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

    感谢您的帮助

4 个答案:

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

答案 1 :(得分:0)

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

(\/\/=+)(\s*\/\/ .+?$)+

答案 2 :(得分: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.
}

答案 3 :(得分:0)

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

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

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