查找并输出匹配指定正则表达式的范围

Find and output range that match specified regex

我有以下结构的文件:

//-BeginBlock-//
Any info with any lines quantity
//-01.02.2015 02:00:00-//
//-BeginBlock-//
Any info with any lines quantity
//-02.03.2015 00:06:00-//

等等...

现在,如何打印脚本用户指定的包含正则表达式的块的内容?示例:对于文件

//-BeginBlock-//
qwerty 8567
Some
Info
In Block 1
//-01.02.2015 02:00:00-//
//-BeginBlock-//
dsdfh 9854
Some info in Block 2
//-02.02.2015 02:00:00-//
//-BeginBlock-//
dsdfh 9855 Some info in Block 3
//-03.02.2015 02:00:00-//

和正则表达式 dsdfh 985* 脚本必须 return

//-BeginBlock-//
dsdfh 9854
Some info in Block 2
//-01.02.2015 02:00:00-//
//-BeginBlock-//
dsdfh 9855 Some info in Block 3
//-01.02.2015 02:00:00-//

甚至只是块的内容,由定界符分隔。 我发现可以通过 sed -n '/\/\/-BeginBlock-\/\//I,/\/\/-/p' ~/.marks 获得范围 但我不知道如何让它按预期工作。我还尝试将 grep 与 grep -Eizoa "\/\/-BeginBlock-\/\/" ~/.marks 之类的 -zo 标志一起使用,但也无法使其正常工作。 有没有办法用标准 bash utils 解决该程序?

您需要使用 -P 参数。

$ grep -ozP '(?s)[^\n]*//-BeginBlock-//[^\n]*(?:(?!//-).)*dsdfh 985.*?//-[^\n]*' file
//-BeginBlock-//
dsdfh 9854
Some info in Block 2
//-02.02.2015 02:00:00-//
//-BeginBlock-//
dsdfh 9855 Some info in Block 3
//-03.02.2015 02:00:00-//