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

时间:2015-02-02 00:31:47

标签: regex linux bash sed grep

我的文件具有以下结构:

//-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*脚本必须返回

//-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标志,但也无法使其工作。 有没有办法用standart bash utils解决该程序?

1 个答案:

答案 0 :(得分:1)

您需要使用-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-//