0
我的输入是这样的:由图案获取第n个范围
start
content A
end
garbage
start
content B
end
我要提取的第二(或第一或第三...)start .. end
块。随着
sed -ne '/start/,/end/p'
我可以过滤掉垃圾,但我怎么得到只是“开始内容乙结束”?
我的输入是这样的:由图案获取第n个范围
start
content A
end
garbage
start
content B
end
我要提取的第二(或第一或第三...)start .. end
块。随着
sed -ne '/start/,/end/p'
我可以过滤掉垃圾,但我怎么得到只是“开始内容乙结束”?
但无论如何,如果你想SED - 你sed :)
/^start$/{
x
s/^/a/
/^aaa$/{
x
:loop
p
/^end$/q
n
bloop
}
x
}
中间匹配的a的数量等于您想要获得哪个段。你也可以像Dennis指出的那样在正则表达式中重复它。该方法允许为脚本指定直接编号。
注意:该脚本应与-n
sed
选项一起运行。
获取所有范围
$ 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
为什么`sed`?为了效率的原因?因为`awk`尽管速度较慢,但脚本在这种情况下更容易理解。 – 2011-02-16 13:47:26
我不同意“较慢”的评论 – kurumi 2011-02-16 13:48:49
@pooh你说得对,awk也很好。 – phihag 2011-02-16 14:23:37