Bash sed或awk删除多行,以'if'开头,以'if`'结尾;这是结束语`

Bash sed或awk删除多行,以'if'开头,以'if`'结尾;这是结束语`,bash,awk,sed,Bash,Awk,Sed,这个问题的延伸。。。我想我应该让它更健壮 因此,我不想计算有多少个fi,而是希望能够简单地执行一些 如果我有以下文件/somepath/somefile,其中包含: ... # Test something? if something then do something if somethingelse then do somethingelse fi fi ... …对于未知数量的可能if/fi语句,如何删除从包含“某物””字符串开始的行到包含结束“fi”的行到第一个if”语句的所有内容

这个问题的延伸。。。我想我应该让它更健壮

因此,我不想计算有多少个
fi
,而是希望能够简单地执行一些

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

...

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

...

…对于未知数量的可能
if
/
fi
语句,如何删除从包含“
某物”
”字符串开始的行到包含结束“
fi
”的行到第一个
if
”语句的所有内容?非常感谢您的帮助

一般来说,这需要一个解析器。但是,如果脚本中的所有命令都遵循问题示例中的模式(
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

一般来说,这需要一个解析器。但是,如果脚本中的所有命令都遵循问题示例中的模式(
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

再次感谢你的帮助!这似乎确实有效,而且目前也将有效。有趣的是,我现在明白了模式的重要性。也许python更适合?我想确保它是健壮的。不客气(x2)。不过,我不确定我是否理解你的问题。您的意思是问Python是否比Awk更适合此任务?如果是这样,我想说,不一定。Awk允许您更简洁地表达某种文本转换,因为它是基于每条记录进行操作的。你可以通过阅读来理解Awk。它很短而且写得很清楚。@trytryagree:无论您使用Python、Perl、Ruby、Bash还是其他任何东西,都没有关系——除非您将shell脚本作为shell脚本进行认真的解析,而不是作为带有模式的文本行进行解析,否则结果会很微妙。要使它对人们在脚本中所能做的事情具有健壮性是很困难的。正则表达式是一种近似工具;它们和你想要的差不多。如果你想让它变得严格,你必须使用解析而不是正则表达式。您能想象编写正则表达式来处理shell中带引号的字符串吗?作业?命令替换?这里有医生吗?等等,不容易!awk不支持单词边界吗
/\/
/\bif\b/
@和lrc:这取决于您使用的Awk的变体。由于未指定使用哪种变体,因此最安全的做法是假设答案为“否”。再次感谢您的帮助!这似乎确实有效,而且目前也将有效。有趣的是,我现在明白了模式的重要性。也许python更适合?我想确保它是健壮的。不客气(x2)。不过,我不确定我是否理解你的问题。您的意思是问Python是否比Awk更适合此任务?如果是这样,我想说,不一定。Awk允许您更简洁地表达某种文本转换,因为它是基于每条记录进行操作的。你可以通过阅读来理解Awk。它很短而且写得很清楚。@trytryagree:无论您使用Python、Perl、Ruby、Bash还是其他任何东西,都没有关系——除非您将shell脚本作为shell脚本进行认真的解析,而不是作为带有模式的文本行进行解析,否则结果会很微妙。要使它对人们在脚本中所能做的事情具有健壮性是很困难的。正则表达式是一种近似工具;它们和你想要的差不多。如果你想让它变得严格,你必须使用解析而不是正则表达式。您能想象编写正则表达式来处理shell中带引号的字符串吗?作业?命令替换?这里有医生吗?等等,不容易!awk不支持单词边界吗
/\/
/\bif\b/
@和lrc:这取决于您使用的Awk的变体。由于未指定使用哪种变体,因此最安全的做法是假设答案为“否”。如果
某物?
行后面没有紧跟
if
语句,该怎么办?它不算数,或者任意数量的行可以介入?如果您有
东西会发生什么情况?
在第20行,
同时…;是否在第21行执行
,如果在第22行执行?输出中将有一个
done
,而
while
没有匹配的
。如果
某物?
行后面没有紧跟
if
语句,该怎么办?它不算数,或者任意数量的行可以介入?如果您有
东西会发生什么情况?
在第20行,
同时…;是否在第21行执行
,如果在第22行执行
?输出中将有一个
done
,而
不匹配。