输入文件
aaa
Any--END--Pattern
bbb
ANY--BEGIN--PATTERN
ccc # do not print
ANY--BEGIN--PATTERN # print 1
ddd # print 2
Any--END--Pattern # print 3
eee
fff
ANY--BEGIN--PATTERN # print 4
ggg # print 5
Any--END--Pattern # print 6
hhh # print 7
Any--END--Pattern # print 8
iii # do not print
ANY--BEGIN--PATTERN
jjj
想要输出
ANY--BEGIN--PATTERN # print 1
ddd # print 2
Any--END--Pattern # print 3
ANY--BEGIN--PATTERN # print 4
ggg # print 5
Any--END--Pattern # print 6
hhh # print 7
Any--END--Pattern # print 8
注意事项
-
从当前
Any--END--Pattern
之前的最新ANY--BEGIN--PATTERN
打印 . -
打印到最后
Any--END--Pattern
如果没有ANY--BEGIN--PATTERN
见面 .
许多类似的问题,但无法找到这个问题的答案
-
How to select lines between two patterns? [awk / sed / grep]
-
awk print only lines between two patterns removing first match
-
How to select lines between two marker patterns which may occur multiple times with awk/sed
-
Extract lines between two patterns with awk and a variable regex
-
How to select lines between two marker patterns which may occur multiple times with awk/sed
-
......
我从这些问题中测试的答案打印了行 ccc
和/或行 iii
...或者不打印具有 BEGIN
和 END
模式的行 . 我的几次尝试都有这些相同的缺点和缺陷 .
我们可以编写十行脚本,但我确信有一个优雅的单行命令解决了这个问题,但我找不到它 . 因此,我认为这可能是一个很好的问题;-)
我想知道使用 sed
, awk
, perl
或者类似Unix的系统上任何其他可用工具的技巧是什么 . 请提供一个小命令行使用:bash,grep,sed,awk,perl或您认为的任何其他工具...
编辑:
只是为了从Sundeep的注释中强调简单的命令行,通过反转输入文件来简化问题:
tac input.txt | sed -n '/END/,/BEGIN/p' | tac
但是这个命令行也会打印出来
(对于寻找类似问题的其他用户,可能不会发生这种情况)
aaa
Any--END--Pattern
ANY--BEGIN--PATTERN # print 1
ddd # print 2
Any--END--Pattern # print 3
ANY--BEGIN--PATTERN # print 4
ggg # print 5
Any--END--Pattern # print 6
hhh # print 7
Any--END--Pattern # print 8
(此答案在此C编码规则中使用)
3 回答
awk
救援!Perl救援!
@buffer
累积来自BEGIN的行,$last_end
指向缓冲区中的最后一个END,这样就可以丢弃不在END中结束的累积行 .作为单线(但为什么?):
这应该适用于sed