我希望使用 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
的解决方案感兴趣。
我正在寻找上述示例的特定解决方案,以及有关如何针对一组任意模式进行概括的任何指导。
我的环境是:
答案 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
{ ... }