使用sed进行多行删除

时间:2011-01-05 19:00:18

标签: sed

我正在尝试使用sed删除所有出现的

#ifdef _WIN32

#endif

#ifdef和#endif之间存在的所有内容都是空行。我使用sed的经验有限,我已经阅读了关于多线功能的一些文档,但我似乎无法弄明白。任何帮助表示赞赏!

3 个答案:

答案 0 :(得分:5)

您可以尝试sed -e '/^#ifdef _WIN32/,/^#endif/d',但它不会推广到更复杂的嵌套案例。

答案 1 :(得分:4)

对于这项工作,我建议使用专为此工作设计的工具 - 而不是sed

  • 使用coan;它有一种选择性地编辑#ifdef#ifndef以及#if#elsif行的模式。例如,您使用:

    coan source -U_WIN32 sourcefile.c
    

这将处理所有_WIN32部分,只留下必要的部分。

另请参阅我的相关问题:Is there a C pre-processor which eliminates #ifdef blocks based on values defined/undefined?

答案 2 :(得分:2)

如果存在 想要删除的#ifdef _WIN32/#endif对之间存在非空行的对,请使用以下内容:

sed 'N;N;s/\n#ifdef _WIN32\n[[:space:]]*\n#endif\n/\n/;P;D'

输入

this is the first line
#ifdef _WIN32
  // Don't delete this comment!
#endif

stuff here
more stuff here
#ifdef _WIN32

#endif
last line

输出

$ sed 'N;N;s/\n#ifdef _WIN32\n[[:space:]]*\n#endif\n/\n/;P;D' ifdef.sed
this is the first line
#ifdef _WIN32
  // Don't delete this comment!
#endif

stuff here
more stuff here
last line