【问题标题】:Sed script for delete C++ comments: script duplicate the lines用于删除 C++ 注释的 Sed 脚本:脚本复制行
【发布时间】:2016-01-21 16:43:39
【问题描述】:

我正在使用此脚本删除所有带有 sed 的 C/C++ cmets:

http://sed.sourceforge.net/grabbag/scripts/remccoms3.sed

sed -i -f remccoms3.sed Myfile.cpp

但是这个脚本复制了所有的行,例如:

/*-------------------------------------------------------------------------------
This file is part of MyProject.
Author Worvast 
#-------------------------------------------------------------------------------*/

#include <fstream>
#include <sstream>

//Other files
#include "Data.h"
#include "utility.h"

  // Open input file
  std::ifstream input_file;

转换为:

#include <fstream>
#include <fstream>
#include <sstream>
#include <sstream>


#include "Data.h"
#include "Data.h"
#include "utility.h"
#include "utility.h"


  std::ifstream input_file;
  std::ifstream input_file;

老实说,我不了解 SED,也无法了解错误在哪里。对这个问题有任何想法或解决方案吗?

【问题讨论】:

    标签: bash sed


    【解决方案1】:

    运行sed 脚本的预期命令行是/bin/sed -nf(来自shebang 行)。

    您的命令 (sed -i -f remccoms3.sed) 省略了 -n 参数。

    sed-n 参数是

    -n, --quiet, --silent

    禁止自动打印图案空间

    所以没有它你会得到正常的打印脚本的打印。

    【讨论】:

      【解决方案2】:

      不要使用那个脚本。它很可爱,有些人可能会觉得它作为一种脑力锻炼很有趣,但它有问题(正如它自己所说的那样,它是bugfixed to some extent!),非常复杂并且完全不适合 sed。

      要从所有版本的 C 或 C++ 代码中删除 cmets,只需使用 https://stackoverflow.com/a/13062682/1745001 处的脚本并将适当的 C 或 C++ 版本作为参数之一传递给 gcc

      另外,如果您想保留空行而不是删除它们(我首先编写了这个工具来计算 NCSL,所以删除空行是可取的)以及 cmets,然后只需调整 sed 以使它们看起来不像空行海湾合作委员会:

      $ cat decomment.sh
      [ $# -eq 2 ] && arg="$1" || arg=""
      eval file="\$$#"
      sed 's/a/aA/g;s/__/aB/g;s/#/aC/g;s/^[[:space:]]*$/aD/' "$file" |
                gcc -P -E $arg - |
                sed 's/aD//;s/aC/#/g;s/aB/__/g;s/aA/a/g'
      
      $ ./decomment.sh file
      
      #include <fstream>
      #include <sstream>
      
      #include "Data.h"
      #include "utility.h"
      
        std::ifstream input_file;
      

      或者如果您有一个 ANSI C 版本的输入文件,其中 cmets 不能以 // 开头,只需告诉工具:

      $ ./decomment.sh -ansi file
      
      #include <fstream>
      #include <sstream>
      
      //Other files
      #include "Data.h"
      #include "utility.h"
      
        // Open input file
        std::ifstream input_file;
      

      这是一个 C 构造示例(三元组 ??/ 表示 \),庞大的 sed 脚本无法正确处理,但小型 sed+gcc 脚本可以正常处理,因为 gcc 包含一个解析器语言,而不是一堆正则表达式估计:

      $ cat tst.c
      //C hello world example
      #include <stdio.h>
      
      /??/
      * This is a comment using trigraphs */
      
      int main()
      {
          printf("Hello world\n");
          return 0;
      }
      

      .

      $ ./remccoms3.sed tst.c
      
      #include <stdio.h>
      
      /??/
      * This is a comment using trigraphs */
      
      int main()
      {
          printf("Hello world\n");
          return 0;
      }
      

      .

      $ ./decomment.sh -trigraphs tst.c
      #include <stdio.h>
      
      
      int main()
      {
          printf("Hello world\n");
          return 0;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-02-22
        • 2010-10-24
        • 1970-01-01
        • 2020-11-04
        • 2017-10-14
        • 2020-07-14
        • 2020-04-02
        • 2017-05-02
        相关资源
        最近更新 更多