使用sed,如何删除与任何一组模式匹配的所有初始行?

时间:2017-02-10 11:36:18

标签: bash awk sed centos7

我希望使用 sed 删除文件中与一组模式匹配的所有初始行。但是,一旦没有匹配的模式,文件的其余部分应该通过未经修改的传递。

例如,如果模式是:

^\s*#
^\s*$

然后是文件:

#!/bin/bash
# Some words

# The line above has spaces or tabs in it
    #
    # The above line has spaces before and after the #

main()
{ ... }

# Another comment

sed脚本会生成:

main()
{ ... }

# Another comment

也就是说,在这种情况下,这组模式会删除任何初始 Bash注释,空白行和只有空格的行。

虽然听说如何使用其他工具(例如awk)可能会有兴趣,但我主要对涉及sed的解决方案感兴趣。

我正在寻找上述示例的特定解决方案,以及有关如何针对一组任意模式进行概括的任何指导。

我的环境是:

  • CentOS 7.3(3.10.0-514.6.1.el7.x86_64)
  • 的bash-4.2.46-21.el7_3.x86_64
  • 沉渣 - 4.2.2-5.el7.x86_64

1 个答案:

答案 0 :(得分:2)

删除匹配的行,但是一旦超过所有模式,只需使用循环:done;n;bdone打印其余模式

以下是示例:

test.c的:

#!/bin/bash
# Some words

# The line above has spaces or tabs in it
    #
    # The above line has spaces before and after the #

DELETEME

main()
DELETEME - should stay
{ ... }



$ sed '/^\s*#/d; /DELETEME/d; /^\s*$/d; :done;n;bdone' test.c 
main()
DELETEME - should stay
{ ... }