2009-12-22 40 views

回答

2
在Perl

perl -nle '/B.*/ && last; print; ' source.txt 
+0

/B.*/将匹配任何含有B,不与B.起始 – rjh

+0

这个问题并没有说'B'应该在一行的开头。 –

+0

对不起,你是对的 - 这取决于我们在那里的解释。 – rjh

5
sed '/^B/,$d' 

读到如下:删除(d)与同“B开头的第一行开始的所有行“(/^B/),直到最后一行($)。

0

如果Perl是一种possibilty,你可以做这样的事情:如果

% perl -0ne 'if (/B.*/) { print $`; last }' INPUT_FILE 
+0

在做任何事之前,似乎过度地将整个文件读入内存。 – ephemient

7

其从文件开始

awk '/^B/{exit}1' file 

,如果你想从具体的行号

启动
awk '/^B/{exit}NR>=10' file # start from line 10 
11

perl -pe 'last if /^B/' source.txt

的解释:-p开关增加了一个环周围的代码,将其变成这样:

 
while (<>) { 
    last if /^B.*/; # The bit we provide 
    print; 
} 

最后关键字退出周围循环,如果紧接在条件成立 - 在这种情况下,/^B /,这表示该行以a开始。

6
sed -n '1,/^B/p' 

从第1行打印到/^B /(含)。 -n可以抑制默认回声。


更新:哎呀....不想 “布拉沃”,所以不是需要反向操作;-)

sed -n '/^B/,$!p' 

/I3az/

+0

不幸的是,这个打印包括“Bravo”这一行,而这个问题想排除“Bravo”这一行。 – ndim

+0

Arghh!...没有正确地阅读问题。对于不在/^B /和文件结尾之间的所有内容,用反向操作“!p”(即print!)更新。非常感谢您发现这个ndim。 – draegtun

+0

啊。 '!'修改一个地址范围,使其只匹配不匹配的地址,反之亦然。它仍然是地址范围的一部分。那么,'!'对我来说是新的......感谢您指点我。 – ndim

1

这里是一个Perl的一个班轮:

perl -pe 'last if /B/' file 
2

只是分享一些答案我已经收到:

打印数据开始在第一行,并继续下去,直到我们找到了匹配的正则表达式,然后停止:

<command> | perl -n -e 'print "$_" if 1 ... /<regex>/;' 

打印数据开始在第一行,并继续下去,直到我们找到了匹配的正则表达式,但不显示正则表达式匹配的行:

<command> | perl -pe '/<regex>/ && exit;' 

做这在sed:

<command> | sed -n '1,/<regex>/p' 
+0

触发器操作符是我的最爱之一,这种情况是我使用它的几次之一。 :) –

3

由别人给出的一些sed命令会在发现正则表达式后继续不必要地处理输入,这对于大量输入来说可能相当慢。这种退出时,正则表达式中发现:

sed -n '/^Bravo/q;p' 
2

你的问题是perlfaq6上回答的变化:How can I pull out lines between two patterns that are themselves on different lines?


您可以使用Perl的有点异国情调..经营者(在perlop中描述):

perl -ne 'print if /START/ .. /END/' file1 file2 ... 

如果你想要的文字,而不是行,你会用

perl -0777 -ne 'print "$1\n" while /START(.*?)END/gs' file1 file2 ... 

但是,如果你想要嵌套START到END的出现,您将遇到本节中关于匹配平衡文本的问题中描述的问题。

这是一个使用的另一示例..:

while (<>) { 
    $in_header = 1 .. /^$/; 
    $in_body = /^$/ .. eof; 
# now choose between them 
} continue { 
    $. = 0 if eof; # fix $. 
} 
0

一个衬里与基本外壳命令:

head -`grep -n B file|head -1|cut -f1 -d":"` file 
相关问题