Regex 使用sed命令删除多种类型的注释

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

我有一个C文件目录。我想从这些源文件中删除所有类型的注释

例如,假设我有一个类似于以下文件的源代码

#包括
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>。同意,了解该语言的解析器是非常可靠的!