Regex 使用sed命令删除多种类型的注释
我有一个C文件目录。我想从这些源文件中删除所有类型的注释 例如,假设我有一个类似于以下文件的源代码Regex 使用sed命令删除多种类型的注释,regex,linux,shell,sed,comments,Regex,Linux,Shell,Sed,Comments,我有一个C文件目录。我想从这些源文件中删除所有类型的注释 例如,假设我有一个类似于以下文件的源代码 #包括 int main(){ 整数; /*示例多行注释 *第1行 *第2行 */ printf(“输入一个整数:”); //读取并存储输入 scanf(“%d”和编号); printf(“您输入了:%d”,数字);//显示输出 返回0; /*评论*/ } 我想删除此代码中所有类型的注释。这包括, // /* */ /* * */ 我尝试使用sed命令执行此任务 find . -type
#包括
int main(){
整数;
/*示例多行注释
*第1行
*第2行
*/
printf(“输入一个整数:”);
//读取并存储输入
scanf(“%d”和编号);
printf(“您输入了:%d”,数字);//显示输出
返回0;
/*评论*/
}
我想删除此代码中所有类型的注释。这包括,
//
/* */
/*
*
*/
我尝试使用sed命令执行此任务
find . -type f |xargs sed -i 's,/\*\*,,g;s,\*/,,g;s,/\*,,g;s,//,,g'
这只会删除上述注释符号本身,而不会删除注释。我想删除整个评论以及上述三个评论符号
我怎样才能达到这个标准 从两个角度来处理这个问题
sed'//^\//\//d'
要在开始和结束之间删除,请使用:
sed的/\/\*.\*\/://'
警告。当您有可能以适用字符开头的其他行时,请小心
我希望这就是您想要的。这是一种使用
awk
的时间传递尝试,但可能会有帮助:
#! /usr/bin/env bash
awk '
function remove_comments(line)
{
# multi-line comment is active, clear everything
if (flag_c == 1) {
if (sub(/.*[*][\/]$/, "", line)) {
flag_c=0
}
else {
# skip this line
# its all comment
return 1
}
}
# remove multi-line comments(/**/) made on the same line
gsub(/[\/][*].*[*][\/]/, "", line)
# remove single line comments if any
sub(/[\/][\/].*$/, "", line)
# make flag_c=1 if a multi-line comment has been started
if (sub(/[\/][*].*/, "", line))
{
flag_c=1
}
return line
}
##
# MAIN
##
{
$0 = remove_comments($0)
if ($0 == 1 || $0 == "")
next
print
}
' file.c
对此,最好使用C预处理器,如的答案所示 您可以通过运行
gcc-fpreprocessed-dD-efoo.c
来请求预处理器删除注释
$ cat foo.c
#include <stdio.h>
int main() {
int number;
/* Sample Multiline Comment
* Line 1
* Line 2
*/
printf("Enter an integer: ");
// reads and stores input
scanf("%d", &number);
printf("You entered: %d", number); //display output
return 0;
/* Comment */
}
$ gcc -fpreprocessed -dD -E foo.c
# 1 "foo.c"
#include <stdio.h>
int main() {
int number;
printf("Enter an integer: ");
scanf("%d", &number);
printf("You entered: %d", number);
return 0;
}
$cat foo.c
#包括
int main(){
整数;
/*示例多行注释
*第1行
*第2行
*/
printf(“输入一个整数:”);
//读取并存储输入
scanf(“%d”和编号);
printf(“您输入了:%d”,数字);//显示输出
返回0;
/*评论*/
}
$gcc-FP再加工-dD-E foo.c
#1“foo.c”
#包括
int main(){
整数;
printf(“输入一个整数:”);
scanf(“%d”和编号);
printf(“您输入了:%d”,编号);
返回0;
}
IMHO我不认为任何其他工具适合此任务,这也可能导致误报。所以更好的做法是,为什么不使用这种语言本身呢?我在谷歌上找到了一个链接,看看这是否对你有帮助?@coder:你有没有想到类似strcpy(s,“//这不是注释”)?这是否回答了你的问题?对不起,这对我没用。我使用您的代码运行了以下命令find-键入f|xargs sed-i'/^\/\//\//d'但是,它没有显示任何效果。@agent82:执行此命令时要小心。一个C程序可能有一条逻辑线跨越多条物理线,方法是在一行的末尾加一个反斜杠-键入f-print0 | xargs-0 sed-i'/^\/\//\//d'。另外,请先尝试在一个文件的cat上使用sed命令,以确保它执行了您想要的操作,然后再将其daisychain到一个find。@agent82否它仍然不工作,因为它是nickpicking,但对于诸如printf(“http://www.foo.bar");代码>如果没有该语言的解析器,恐怕我们无法可靠地删除注释。@tshiono,是的,这是有道理的。脚本将在字符串A中考虑<代码> /< /COD>。同意,了解该语言的解析器是非常可靠的!