我已经看过一些前后点击线的例子,但是我想忽略中间线。 所以,我之前想要五行,但没有别的。 可以这样做吗?
答案 0 :(得分:29)
好的,我认为这会做你想要的。它将寻找一个模式,并在每场比赛前提取第5行。
grep -B5 "pattern" filename | awk -F '\n' 'ln ~ /^$/ { ln = "matched"; print $1 } $1 ~ /^--$/ { ln = "" }'
这基本上是如何工作的,它需要第一行,打印它,然后等到它看到^--$
(grep使用的匹配分隔符),然后重新开始。
答案 1 :(得分:10)
这是选项-B
-B NUM, --before-context=NUM Print NUM lines of leading context before matching lines. Places a line containing -- between contiguous groups of matches.
答案 2 :(得分:7)
如果你只想在比赛前获得第5行,你可以这样做:
grep -B 5 pattern file | head -1
编辑:
如果您可以有多个匹配项,则可以尝试此操作(与实际模式交换pattern
):
sed -n '/pattern/!{H;x;s/^.*\n\(.*\n.*\n.*\n.*\n.*\)$/\1/;x};/pattern/{x;s/^\([^\n]*\).*$/\1/;p}' file
我是从Sed tutorial部分:Keeping more than one line in the hold buffer,示例2中获取此内容并对其进行了调整。
答案 3 :(得分:2)
这种方式对我来说更容易:
...
<% form_for [resource_name, resource.with_pessoa], :url => registration_path(resource_name) do |f| %>
...
<% f.fields_for :pessoa do |pessoa_form| %>
...
<% end %>
在包含模式之前,包括5行,关闭---组分隔符,然后每隔5行打印一次。