【发布时间】:2015-04-30 21:19:33
【问题描述】:
我遇到了以下问题,但没有找到解决方案,也没有找到为什么 awk 会出现这种奇怪的行为。
假设我在文件中有以下文本:
startcue
This shouldn't be found.
startcue
This is the text I want to find.
endcue
startcue
This shouldn't be found either.
我想找到“startcue”、“This is the text I want to find.”和“endcue”这几行。
我天真地假设通过 awk '/startcue/,/endcue/' 进行简单的范围搜索就可以了,但这会打印出整个文件。我猜 awk 以某种方式找到了第一个范围,但是当第三个 startcue 在打印行时触发时,它会打印所有行,直到文件结尾(不过,这对我来说似乎有点奇怪)。
现在问题是:我怎样才能让 awk 打印出我不想要的行?也许作为一个额外的问题:任何人都可以解释 awk 的行为吗?
谢谢
【问题讨论】:
-
该范围匹配尽可能多的次数。第一个匹配是第 1 行到
endcue,第二个匹配是最后一个startcue到末尾。所以不应该打印第二个空行。您如何期望 awk 知道要使用哪个 startcue(供您建议的用法)。您可以通过手动保留线条来做您想做的事情(并在您击中新的开始线条时删除以前保存的线条)。 -
永远不要使用范围表达式,始终使用标志,例如
/start/{f=1} f; /end/{f=0}。范围表达式使解决琐碎工作的脚本变得非常简单,但是当您发现即使是最微小的复杂性时,也需要完全重写和/或复制条件。
标签: regex bash search awk range