这是一种基本的方法,但它提供了一个概念证明,说明可能会做些什么。我使用Bash,并结合使用
GCC -fsyntax-only
选项来完成这个任务。
以下是Bash脚本:
#!/bin/bash
while IFS='' read -r line || [[ -n "$line" ]]; do
LINE=`echo $line | grep -oP "(?<=//).*"`
if [[ -n "$LINE" ]]; then
echo $LINE | gcc -fsyntax-only -xc -
if [[ $? -eq 0 ]]; then
sed -i "/$LINE/d" ./$1
fi
fi
done < "$1"
我在这里采用的方法是从代码文件中逐行阅读。然后,使用正则表达式
(?<=//).*
(如果存在) 在
//
分隔符后的文本上进行
grep
,并将其传递给
gcc -fsyntax-only
命令
检查它是否是正确的C/C++语句。请注意,我使用了参数
-xc -
将输入从stdin传递给GCC
(在这里查看我的答案以了解更多信息)。一个
重要的说明,
-xc -
中的
c
指定语言,在这种情况下是C,如果你想要C++,你应该将其改为
-xc++
。
然后,如果GCC能够成功解析语句(即它是合法的C/C++语句),我直接使用sed -i
从传递的文件中删除它。
在您的示例上运行它(但在删除第三行的<- commented code
使其成为合法语句之后):
// Those parameters control foo and bar... <- valid comment
int t = 5;
// int t = 10;
int k = 2*t;
输出(在同一文件中):
// Those parameters control foo and bar... <- valid comment
int t = 5;
int k = 2*t;
如果您想将修改添加到不同的文件中,只需从“sed -i”中删除“-i”。脚本可以像这样调用:
./script.sh file.cpp
,它可能会显示几个GCC错误,因为这些是有效的注释。
更新。
相同逻辑的更简化版本如下:
#!/bin/bash
while IFS='' read -r line || [[ -n "$line" ]]; do
if [[ "$line" =~ [/]+.* ]]; then
$LINE=${line##*\/}
echo ${$LINE} | gcc -fsyntax-only -xc - && sed -i "/$LINE/d" ./$1
fi
done < "$1"
//
开头的行。 - François Andrieux