2014-02-10 62 views
0

这里有一个commands.txt中的文件:如何使用sed/regex查找最后一个多行匹配?

START - 'cmd1' 
results1a 
results1b 
results1c 
END - 'cmd1' 
START - 'cmd2' 
results2a 
results2b 
END - 'cmd1' 
START - 'cmd1' 
results1d 
results1e 
results1f 
END - 'cmd1' 

这是我到目前为止有:

cat commands.txt | sed -n 's/^START - '"'"'(cmd1)'"'"'$/\1/p' 

,输出是

cmd1 
cmd1 

我所要的输出是什么是

results1d 
results1e 
results1f 

我还没有想出如何获得多行匹配。

+0

你的正则表达式明确地捕捉'cmd1'然后使用该作为替换,这可以解释当前的行为。 – Vache

回答

2

这一行适用于您的需求:

awk "NR==FNR{if(/^START - 'cmd1'/)p=NR;next}FNR>p{if(/^END/)exit;print}" file file 

可以使正则表达式更加严格,像^ and $,但你有我的想法如何处理它。

+0

谢谢。确切地说它应该是什么。从来没有想过使用awk。 – thecooltodd

2

如果您愿意,仍然可以在sed中完成。

sed -r ':a;$!{N;ba};s/.*START[^\\\n]+\n(.*)\nEND.*/\1/' file 

results1d 
results1e 
results1f 
1

这可能为你工作(GNU):

sed '/START/h;//,/END/{//!H};$!d;x;s/[^\n]*\n//' file 
相关问题