按模式获取第n个范围

时间:2011-02-16 13:42:48

标签: sed awk text-processing

我的输入是这样的:

start
content A
end
garbage
start
content B
end

我想提取第二个(或第一个或第三个......)start .. end块。与

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

我可以过滤掉垃圾,但是如何才能“开始内容B结束”?

2 个答案:

答案 0 :(得分:2)

但无论如何,如果你想要sed - 你会得到sed:)

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

中间匹配中的a数等于您想要获得的分段数。正如丹尼斯指出的那样,你也可以在regexp中重复它。该方法允许为脚本指定直接编号。

注意:该脚本应使用-n sed选项运行。

答案 1 :(得分: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

Ruby(1.9+),获得第一个范围

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

content A