sed或awk删除以`if`开头并以'if`结束`fi`结尾的多行

时间:2016-05-28 22:03:07

标签: bash awk sed

此问题的扩展Delete multiple lines - from "patternA" match, through second occurrence of "patternB" ...我想我应该让它更强大。

所以,不是计算多少fi,而是可能存在未知数量,我希望能够简单地执行某些事情......

如果我有以下文件/somepath/somefile包含:

...

# Test something?
if something
then
do something
if somethingelse
then
do somethingelse
fi
fi

...

...包含未知数量的可能if / fi语句,如何从包含“something?”的字符串开始的行中删除所有内容将“fi”关闭到第一个if?任何/所有帮助表示赞赏。

1 个答案:

答案 0 :(得分:5)

一般来说,你需要一个解析器。但是,如果脚本中的所有命令都遵循问题中的示例模式(if / fi始终在行的开头),那么这个有点粗糙的if计数解决方案应该可行。

awk 'BEGIN { del=0; level=0 } /Test something?/ { del=1 } del==0 { print } /^if / { level++ } /^fi( |$)/ { level--; if (level == 0) del=0 }' somefile