使用范围模式如何检测范围内的 EOF?

Using a range pattern how does one detect EOF within the range?

我想检测这种情况:我没有找到范围的终点。鉴于此 awk 命令:

 awk '/^START/,/^STOP/ { print , }'  x.dat 

和此数据:

garb
START d1
stuff d2
STOP d3
garb
START d1

如何检测 second START 后没有 STOP?这样做的原因是错误检测。我想 "signal" 检测到某种错误。

这取决于你想做什么。您可以查看输出并查看最后一行是否匹配 'STOP'。如果你想在 awk 内检测到它,你可以这样做:

awk '/^START/,/^STOP/ { print ,; a=1 } /^STOP/{a=0} 
    END{ if(a) { 
      # condition detected
     }}' 

但是不太清楚你想做什么。

切勿使用范围表达式,因为它们会使琐碎的任务变得非常简单,但任何更有趣的任务都需要重复条件或完全重写。而不是:

awk '/^START/,/^STOP/ { print , }' x.dat 

你应该写:

awk '/^START/{f=1} f{ print , } /^STOP/{f=0}' x.dat

然后您的新要求可能只需要:

awk '/^START/{f=1} f{ print , } /^STOP/{f=0} END{if (f) print "The sky is falling!"}' x.dat

没有更多细节和特定样本 input/output 进行测试,那是我能做的最好的....