我的输入是这样的:
start
content A
end
garbage
start
content B
end
我想提取第二个(或第一个或第三个......)start .. end
块。与
sed -ne '/start/,/end/p'
我可以过滤掉垃圾,但是如何才能“开始内容B结束”?
答案 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