如何获取第一次和最后一次出现模式之间的所有行?

rah*_*hmu 9 sed text-processing

如何修剪文件(井输入流),以便我只能获得从第一次出现模式foo到最后一次出现模式的行bar

例如考虑以下输入:

A line
like
foo
this 
foo
bar
something
something else
foo
bar
and
the
rest
Run Code Online (Sandbox Code Playgroud)

我希望这个输出:

foo
this 
foo
bar
something
something else
foo
bar
Run Code Online (Sandbox Code Playgroud)

rus*_*ush 8

sed -n '/foo/{:a;N;/^\n/s/^\n//;/bar/{p;s/.*//;};ba};'
Run Code Online (Sandbox Code Playgroud)

sed 模式匹配/first/,/second/逐行读取。当某些行与/first/它匹配时,它会记住它并期待/second/模式的第一个匹配。同时,它应用为该模式指定的所有活动。之后,该过程一次又一次地开始,直到文件末尾。

那不是我们需要的。我们需要查找/second/模式的最后匹配。因此,我们构建只查找第一个条目的结构/foo/。找到后,循环a开始。我们将新行添加到匹配缓冲区N并检查它是否与模式匹配/bar/。如果是,我们只需打印它并清除匹配缓冲区,然后 janyway 跳转到循环的开始ba

我们还需要在缓冲区清理后删除换行符/^\n/s/^\n//。我确信有更好的解决方案,不幸的是我没有想到它。

希望一切都清楚。