0

在我项目中每个文件的标题中,我都有一个由 VCC 生成的注释块,其中包含文件的修订历史记录。我们已从 VCC 移出,并且不再希望在文件中包含修订历史记录,因为它已过时。

我目前有一个搜索 pcregrep 搜索,它返回我正在寻找的确切结果:

pcregrep -rM '(\$Rev)(?s)(.+?(?=\*\*))' *

我已尝试将结果通过管道传输到 xargs sed 以及许多其他尝试从文件中删除所有返回的行但我收到各种错误,包括“文件名太长”

我想删除整个区块

4

1 回答 1

0

由于您在谈论 C++ 文件,因此您不能只找到注释,
您必须解析注释,因为文字字符串可能包含注释
分隔符。

这是以前做过的,没有用重新发明轮子。
一个简单的 grep 不会削减它。您需要一个
具有更好功能的简单宏或 C# 控制台应用程序。

如果你想走这条路,下面是一个适合你的正则表达式。
每个匹配项将匹配第 1 组(评论块)或第 2 组(非评论)。

您需要通过附加每个匹配的结果来重写一个新字符串。
或者,使用回调函数进行替换。

每次匹配第 2 组时,只需将其附加(或在回调时返回)不变。

当它与第 1 组匹配时,您必须对
内容运行另一个正则表达式以查看注释块是否包含修订信息。
如果确实包含它,则不要附加(或在回调时返回“”)其内容。
如果没有,只需将其追加不变。

所以,这是一个两步的过程。

伪代码:

// here read in the source sting from file.
string strSrc = ReadFile( name );
string strNew = "";
Matcher CmtMatch, RevMatch;

while ( GloballyFind( CommentRegex, strSrc, CmtMatch ) )  
{
   if ( CmtMatch.matched(1) )
   {
       string strComment = Match.value(1);
       if ( FindFirst( RevisionRegex, strComment, RevMatch ) )
           continue;
        else
            strNew += strComment;
    }
    else
       strNew += Match.value(2);
 }
 // here write out the new string.


如果使用宏语言,同样可以通过使用回调函数的 ReplaceAll() 来完成。逻辑进入回调。

它并不像看起来那么难,但如果你想做对,我会这样做。
然后,嘿,你有一个漂亮的实用程序可以再次使用。

这是正则表达式扩展=,格式化和压缩。
(使用RegexFormat 6 (Unicode)构建)

 # raw:  ((?:(?:^\h*)?(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/(?:\h*\n(?=\h*(?:\n|/\*|//)))?|//(?:[^\\]|\\\n?)*?(?:\n(?=\h*(?:\n|/\*|//))|(?=\n))))+)|("(?:\\[\S\s]|[^"\\])*"|'(?:\\[\S\s]|[^'\\])*'|[\S\s][^/"'\\\s]*)
 # delimited:  /((?:(?:^\h*)?(?:\/\*[^*]*\*+(?:[^\/*][^*]*\*+)*\/(?:\h*\n(?=\h*(?:\n|\/\*|\/\/)))?|\/\/(?:[^\\]|\\\n?)*?(?:\n(?=\h*(?:\n|\/\*|\/\/))|(?=\n))))+)|("(?:\\[\S\s]|[^"\\])*"|'(?:\\[\S\s]|[^'\\])*'|[\S\s][^\/"'\\\s]*)/     
 # Dbl-quoted: "((?:(?:^\\h*)?(?:/\\*[^*]*\\*+(?:[^/*][^*]*\\*+)*/(?:\\h*\\n(?=\\h*(?:\\n|/\\*|//)))?|//(?:[^\\\\]|\\\\\\n?)*?(?:\\n(?=\\h*(?:\\n|/\\*|//))|(?=\\n))))+)|(\"(?:\\\\[\\S\\s]|[^\"\\\\])*\"|'(?:\\\\[\\S\\s]|[^'\\\\])*'|[\\S\\s][^/\"'\\\\\\s]*)"     
 # Sing-quoted: '((?:(?:^\h*)?(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/(?:\h*\n(?=\h*(?:\n|/\*|//)))?|//(?:[^\\\]|\\\\\n?)*?(?:\n(?=\h*(?:\n|/\*|//))|(?=\n))))+)|("(?:\\\[\S\s]|[^"\\\])*"|\'(?:\\\[\S\s]|[^\'\\\])*\'|[\S\s][^/"\'\\\\\s]*)'


    (                                # (1 start), Comments 
         (?:
              (?: ^ \h* )?                     # <- To preserve formatting
              (?:
                   /\*                              # Start /* .. */ comment
                   [^*]* \*+
                   (?: [^/*] [^*]* \*+ )*
                   /                                # End /* .. */ comment
                   (?:                              # <- To preserve formatting 
                        \h* \n                                      
                        (?=
                             \h*                  
                             (?: \n | /\* | // )
                        )
                   )?
                |  
                   //                               # Start // comment
                   (?: [^\\] | \\ \n? )*?           # Possible line-continuation
                   (?:                              # End // comment
                        \n                               
                        (?=                              # <- To preserve formatting
                             \h*                          
                             (?: \n | /\* | // )
                        )
                     |  (?= \n )
                   )
              )
         )+                               # Grab multiple comment blocks if need be
    )                                # (1 end)

 |                                 ## OR

    (                                # (2 start), Non - comments 
         "
         (?: \\ [\S\s] | [^"\\] )*        # Double quoted text
         "
      |  '
         (?: \\ [\S\s] | [^'\\] )*        # Single quoted text
         ' 
      |  [\S\s]                           # Any other char
         [^/"'\\\s]*                      # Chars which doesn't start a comment, string, escape,
                                          # or line continuation (escape + newline)
    )                                # (2 end)

如果您想要更简单的东西 -
这是相同的正则表达式,没有多个注释块捕获或格式保留。相同的分组和替换原则适用。

 # Raw:  (/\*[^*]*\*+(?:[^/*][^*]*\*+)*/|//(?:[^\\]|\\\n?)*?\n)|("(?:\\[\S\s]|[^"\\])*"|'(?:\\[\S\s]|[^'\\])*'|[\S\s][^/"'\\]*)


     (                                # (1 start), Comments 
          /\*                              # Start /* .. */ comment
          [^*]* \*+
          (?: [^/*] [^*]* \*+ )*
          /                                # End /* .. */ comment
       |  
          //                               # Start // comment
          (?: [^\\] | \\ \n? )*?           # Possible line-continuation
          \n                               # End // comment
     )                                # (1 end)
  |  
     (                                # (2 start), Non - comments 
          "
          (?: \\ [\S\s] | [^"\\] )*        # Double quoted text
          "
       |  '
          (?: \\ [\S\s] | [^'\\] )*        # Single quoted text
          ' 
       |  [\S\s]                           # Any other char
          [^/"'\\]*                        # Chars which doesn't start a comment, string, escape,
                                           # or line continuation (escape + newline)
     )                                # (2 end)
于 2015-05-20T00:02:26.727 回答