使用sed提取文件的两个表达式之间的行块的第n个或最后一个出现

时间:2017-03-07 03:16:48

标签: sed

输入文件:

1
2
start pattern
3
4   - 1st block
5
end pattern
6
7
.
.
start pattern
20
21     - nth block
22
end pattern
.
.
start pattern
27
28     - last block
29
end pattern
30
31

我试图提取块以及开始模式和结束模式,我可以在sed表达式下使用

sed '/start_pattern/,/end_pattern/!d' inputfile

输出文件:

start pattern
3
4   - 1st block
5
end pattern
start pattern
20
21     - nth block
22
end pattern
start pattern
27
28     - last block
29
end pattern

但我只想要一个特定的块,在当前情况下最后一个块(仅使用sed)

必需的输出:

start pattern
27
28     - last block
29
end pattern

是否可以获得除第一个或最后一个之外的特定事件,如果是这样的话。

问题与以下问题类似,但要求不同。

How to select lines between two marker patterns which may occur multiple times with awk/sed

How to select lines between two patterns?

1 个答案:

答案 0 :(得分:3)

这可能适合你(GNU sed):

sed '/start/,/end/!d;/end/q' file # first occurrence only

sed '/start/h;//!H;$!d;x;s/^\(start.*end[^\n]*\).*/\1/p;d' file # last only

sed '/start/!d;x;s/^/x/;/x\{10\}/!{x;d};x;:a;n;/end/!ba;q' file # 10th only

首先在第一场比赛后退出。

最后一个存储保留空间中最后一个范围匹配,并在文件末尾打印出来。

第n个将计数器存储在保留空间中,当它与所需数字匹配时,打印出下一个范围并退出。