如何在文件开头显示数据直到第一次出现正则表达式?

时间:2009-12-22 13:26:54

标签: regex perl sed awk

如何显示从文件开头到第一次出现正则表达式的数据?

例如,如果我有一个包含以下内容的文件:

One
Two
Three
Bravo
Four 
Five

我想从第1行开始显示文件的内容,并在找到字符串“B *”时停止。所以输出应该如下所示:

One
Two
Three

11 个答案:

答案 0 :(得分:11)

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

解释:-p开关在代码周围添加一个循环,将其转换为:

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

如果条件成立,则最后一个关键字立即退出周围的循环 - 在这种情况下,/ ^ B /,表示该行以B开头。

答案 1 :(得分:7)

如果它是从文件的开头

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

如果您想从特定的行号

开始
awk '/^B/{exit}NR>=10' file # start from line 10

答案 2 :(得分:6)

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

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


更新: Opps ....不想要“Bravo”,所以需要采取相反的行动; - )

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

/ I3az /

答案 3 :(得分:5)

sed '/^B/,$d'

请按以下步骤阅读:删除(d)以第一行开头的所有行,以“B”(/^B/)开头,向上直到最后一行($ )。

答案 4 :(得分:3)

其他人给出的一些sed命令会在找到正则表达式之后继续不必要地处理输入,这对于大输入来说可能非常慢。在找到正则表达式时退出:

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

答案 5 :(得分:2)

Perl中的

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

答案 6 :(得分:2)

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

从第一行开始打印数据,并继续直到我们找到与正则表达式匹配的内容,然后停止:

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

从第一行开始打印数据,并继续直到我们找到与正则表达式匹配的内容,但不显示与正则表达式匹配的行:

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

在sed中执行:

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

答案 7 :(得分: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 $.
}

答案 8 :(得分:1)

这是一个perl one-liner:

perl -pe 'last if /B/' file

答案 9 :(得分:0)

如果Perl有可能,你可以这样做:

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

答案 10 :(得分:0)

带有基本shell命令的一个班轮:

head -`grep -n B file|head -1|cut -f1 -d":"` file