Sed,在两行之间解析,但只打印有限的行

时间:2015-02-25 17:21:49

标签: linux bash awk sed

我的详细信息冗长而简单:) 我有一个如下文件:

Iteration 1
blah blah
.
.
.
blah blah
pattern 1 
detail 1
detail 2
blah blah
.
.
.
blah blah
Iteration 2
.
.
.
Iteration 10
blah blah
.
.
.
blah blah
pattern 1 
detail 1
detail 2
blah blah
.
.
.
blah blah

(某些迭代没有pattern 1)。在此示例中,仅迭代1和迭代10包含模式。 在我感兴趣的模式(细节1和细节2)之后总有2条细节线。

我需要的是解析迭代次数,模式和细节(如果特定的迭代包含模式),如下所示:

Iteration 1
pattern 1
detail 1
detail 2
Iteration 10
pattern 1
...

我做的是:

 sed -n '/Iteration/H;/pattern 1/{N;N;x;G;p}' file

问题:

我的输出类似于

Iteration 1
pattern 1
detail 1
detail 2
pattern 1
detail 1
detail 2
Iteration 2
Iteration 3

它打印出我的图案和细节2次。 它还打印出所有迭代(我只想解析出包含模式的迭代次数)。

2 个答案:

答案 0 :(得分:1)

使用

#                  v-- here
sed -n '/Iteration/h;/pattern 1/{N;N;x;G;p}' file

H将当前行附加到保持缓冲区,h用它替换保持缓冲区。你想要后者,或者你将在后来的匹配块中组装很多东西 - 然后打印出来。

答案 1 :(得分:1)

如果您的文件没有空行,请使用sed进行预处理,方法是将文件分成由空行分隔的记录:

sed '/Iteration/i\
\
' input | awk '/pattern/' RS=