如何去除 C 文件中的 `#ifdef MACRO ... #endif' 段落

如何去除 C 文件中的 `#ifdef MACRO ... #endif' 段落

需求描述:将项目文件中所有.h和.c文件的#ifdef CONFIG_A至#endif部分删除
求助点:由于#ifdef 至#endif 部分中有嵌套的#ifdef 和#endif部分
所以导致不能完全清空,而包含的文件数量极大又无法手动处理
希望大大能给个简单的逻辑框架或介绍某个软件可对此进行处理,谢谢      
抛个砖
复制内容到剪贴板
代码:
[color=blue]-(dearvoid@LinuxEden:tty3)-(~/tmp)-
[765 0][/color] [color=red]; cat foo.c
[/color]
#include <stdio.h>

#ifdef CONFIG_A
#if 1
#if 2
#warn ...
#endif // 1
#else
#warn ...
#endif // 2
#endif // CONFIG_A

#include <a.h>

#ifdef CONFIG_A
#endif

int main(int argc, char *argv[])
{
    return 0;
}
[color=blue]-(dearvoid@LinuxEden:tty3)-(~/tmp)-
[765 0][/color] [color=red]; cat foo.sh
[/color]#! /bin/bash

level=0
IFS=$'\n\r'
while read line; do
    if [[ "$line" == \#ifdef\ CONFIG_A ]]; then
        ((level++))
        while read line; do
            if [[ "$line" == \#if* ]]; then
                ((level++))
            elif [[ "$line" == \#endif* ]]; then
                ((level--))
                if [ $level -lt 0 ]; then
                    echo "Error" 1>&2
                    exit 1
                fi
                if [ $level = 0 ]; then
                    break
                fi
            fi
        done
        continue
    fi
    echo "$line"
done
[color=blue]-(dearvoid@LinuxEden:tty3)-(~/tmp)-
[765 0][/color] [color=red]; ./foo.sh < foo.c
[/color]
#include <stdio.h>


#include <a.h>


int main(int argc, char *argv[])
{
    return 0;
}
[color=blue]-(dearvoid@LinuxEden:tty3)-(~/tmp)-
[765 0][/color] [color=red]; o
[/color]
      
老大真强
现在假设我要对整个文件夹(如kernel)内所有文件递归执行该操作
脚本该如何改?      
[QUOTE=michaelzhang;570758]老大真强
现在假设我要对整个文件夹(如kernel)内所有文件递归执行该操作
脚本该如何改?[/QUOTE]
复制内容到剪贴板
代码:
$ find ... -exec ...
另: 前面给出的 script 仅为示例, 未必能直接使用, 后果自负       
经过测试
该脚本对57个文件进行操作后,26个编译错误
显示unexpected argument      
经过比较原文件和处理过的文件发现
凡是代码中双引号内出现带n的字符串,它便会在n前加上\
这是不是与变量IFS设定不完善有关?谢谢      
不好意思我说反了
实际是原文件中引号内的\n表示换行
处理后\n的\全部被清除了      
此问题已经通过用其他字符串替换\n处理完后再反替换解决
但是新的问题又出现了
它将不会剔除行首为空格的#ifdef至#endif的段
麻烦老大看看怎么改,谢谢      
[QUOTE=michaelzhang;570822]此问题已经通过用其他字符串替换\n处理完后再反替换解决
但是新的问题又出现了
它将不会剔除行首为空格的#ifdef至#endif的段
麻烦老大看看怎么改,谢谢[/QUOTE]
前面警告过你不能直接使用的 仅是提供一点儿 idea, 具体问题还要具体分析, 比如你要考虑以下一些情况:
- #ifdef 之类语句前面是否有空格
- # 和 ifdef 之间是否会有空格
- #ifdef CONFIG_A 后面是否还有注释
... ...      
[QUOTE=michaelzhang;570804]不好意思我说反了
实际是原文件中引号内的\n表示换行
处理后\n的\全部被清除了[/QUOTE]
俺忽略了这个问题 可以通过把 `read' 换成 `read -r' 来解决