我正在使用此脚本删除所有使用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都知道错误在哪里。对这个问题的任何想法或解决方案?
答案 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;
}