2011-02-16 71 views
0

我的输入是这样的:由图案获取第n个范围

start 
content A 
end 
garbage 
start 
content B 
end 

我要提取的第二(或第一或第三...)start .. end块。随着

sed -ne '/start/,/end/p' 

我可以过滤掉垃圾,但我怎么得到只是“开始内容乙结束”?

+0

为什么`sed`?为了效率的原因?因为`awk`尽管速度较慢,但​​脚本在这种情况下更容易理解。 – 2011-02-16 13:47:26

+0

我不同意“较慢”的评论 – kurumi 2011-02-16 13:48:49

+0

@pooh你说得对,awk也很好。 – phihag 2011-02-16 14:23:37

回答

2

但无论如何,如果你想SED - 你sed :)

/^start$/{ 
    x 
    s/^/a/ 
    /^aaa$/{ 
    x 
    :loop 
    p 
    /^end$/q 
    n 
    bloop 
    } 
    x 
} 

中间匹配的a的数量等于您想要获得哪个段。你也可以像Dennis指出的那样在正则表达式中重复它。该方法允许为脚本指定直接编号。

注意:该脚本应与-nsed选项一起运行。

1

获取所有范围

$ awk 'BEGIN{RS="end";FS="start"}{ print $NF}' file 

content A 


content B 

获取第二范围

$ awk 'BEGIN{RS="end";FS="start"}{c++; if (c==2) print $NF}' file 

content B 

红宝石(1.9+),获得第一个范围

$ ruby -0777 -ne 'puts $_.scan(/start(.*?)end/m)[0]' file 

content A