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

使用sed提取文件两个表达式之间第n次或最后一次出现的行块,sed,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/

输入文件:

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
是否有可能获得除第一次或最后一次以外的具体事件,如果有,如何获取?


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

这可能适合您(GNU-sed):

第一场距离赛结束后,第一名球员退出

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


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

输入文件的注释是“第一次出现”、“第n次出现”和“最后一次出现”行吗?如果是这样的话,你能回答这个问题以显示实际投入和预期产出吗?在一种情况下,awk更适合于一般的第n次出现,最后一次出现可以保存并打印在文件末尾,或者使用tac反转输入文件,获得第一次出现,然后再次反转输出。。。见@BenjaminW。我已经用可验证的输出更新了问题。。谢谢你的指点@Sundeep我找不到如何在链接问题中获得特定块。你能给出这个问题的答案吗?这个链接是用来获取awk的起始块和结束块的,你需要根据自己的需要进行更改。。。我的建议是awk在这里比sed更好。。。给它拍张好照片。。。如果使用GNU,也许您可以通过使用
-r
模式来避免转义括号和大括号。@poton,非常感谢,它很有魅力。。尽管我不得不稍微调整它以适应我的模式变量;但是返回输出要花很多时间
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