用于删除C ++注释的sed脚本:脚本重复这些行

时间:2016-01-21 16:43:39

标签: bash sed

我正在使用此脚本删除所有使用sed:

的C / C ++注释

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都知道错误在哪里。对这个问题的任何想法或解决方案?

2 个答案:

答案 0 :(得分:2)

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

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

-n的{​​{1}}参数是

  

-n, - quiet, - silent

     

禁止自动打印图案空间

所以没有它,你可以正常打印脚本的打印。

答案 1 :(得分:0)

不要使用该脚本。它很可爱,有些人可能会觉得它很有趣,但它是一个有缺陷的(因为它说自己是bugfixed to some extent!),荒谬复杂,是一个完全不合适的sed应用程序。

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

此外,如果你想保留空白行而不是删除它们(我首先写这个工具来计算NCSL,所以删除空行是可取的)以及评论然后只是调整sed使它们看起来不像空白行GCC:

$ 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版本输入文件,其中注释不能以//开头,请告诉该工具:

$ ./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脚本将处理得很好,因为{{1包含语言的解析器,而不是它的一堆正则表达式估计:

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;
}