使用sed进行多行删除

使用sed进行多行删除,sed,Sed,我正在尝试使用sed删除所有出现的 #ifdef _WIN32 #endif 其中#ifdef和#endif之间的所有内容都是空行。我使用sed的经验有限,我已经阅读了一些关于多行功能的文档,但我似乎无法理解它。感谢您的帮助 您可以尝试sed-e'/^ ifdef#u WIN32/,/^#endif/d',但它不能推广到更复杂的嵌套情况。如果存在成对的#ifdef#u WIN32/#endif之间有您不想删除的非空行,请使用以下命令: sed 'N;N;s/\n#ifdef _WIN32\n

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

#ifdef _WIN32

#endif

其中#ifdef和#endif之间的所有内容都是空行。我使用sed的经验有限,我已经阅读了一些关于多行功能的文档,但我似乎无法理解它。感谢您的帮助

您可以尝试
sed-e'/^ ifdef#u WIN32/,/^#endif/d'
,但它不能推广到更复杂的嵌套情况。

如果存在成对的
#ifdef#u WIN32/#endif
之间有您不想删除的非空行,请使用以下命令:

sed 'N;N;s/\n#ifdef _WIN32\n[[:space:]]*\n#endif\n/\n/;P;D'
输入 输出
对于这项工作,我建议使用为该工作设计的工具,而不是
sed

  • 使用;它具有选择性编辑
    #ifdef
    #ifndef
    #if
    #elsif
    行的模式。例如,您可以使用:

    coan source -U_WIN32 sourcefile.c
    
这将处理所有的
\u WIN32
部分,只留下必要的部分


另请参见我的相关问题:

是否必须使用sed?perl可以吗?谢谢你的贡献。当我给出
sed
答案时,我就知道有这样一个程序存在,但我没有通过快速搜索找到它。这太棒了!非常感谢,在这里我可以找到此/,/?@Guilherme的文档,您可以在手册页中看到它,其中介绍了地址。任何两个地址都可以用逗号连接,形成一个包含范围。例如,整个文件的
1、$
,或包含
hello
的行的
/hello/,$
直到文件结束,或前10行的
1,10
$ 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
coan source -U_WIN32 sourcefile.c