如何显示文件开头的数据,直到第一次出现正则表达式?如何显示文件开头的数据,直到第一次出现正则表达式?
举例来说,如果我有一个包含文件:
One
Two
Three
Bravo
Four
Five
我要开始显示文件的内容开始于1号线和停车时我发现字符串“B *”。所以输出应该是这样的:
One
Two
Three
如何显示文件开头的数据,直到第一次出现正则表达式?如何显示文件开头的数据,直到第一次出现正则表达式?
举例来说,如果我有一个包含文件:
One
Two
Three
Bravo
Four
Five
我要开始显示文件的内容开始于1号线和停车时我发现字符串“B *”。所以输出应该是这样的:
One
Two
Three
:
perl -nle '/B.*/ && last; print; ' source.txt
sed '/^B/,$d'
读到如下:删除(d
)与同“B开头的第一行开始的所有行“(/^B/
),直到最后一行($
)。
如果Perl是一种possibilty,你可以做这样的事情:如果
% perl -0ne 'if (/B.*/) { print $`; last }' INPUT_FILE
在做任何事之前,似乎过度地将整个文件读入内存。 – ephemient
其从文件开始
awk '/^B/{exit}1' file
,如果你想从具体的行号
启动awk '/^B/{exit}NR>=10' file # start from line 10
perl -pe 'last if /^B/' source.txt
的解释:-p开关增加了一个环周围的代码,将其变成这样:
while (<>) { last if /^B.*/; # The bit we provide print; }
最后关键字退出周围循环,如果紧接在条件成立 - 在这种情况下,/^B /,这表示该行以a开始。
sed -n '1,/^B/p'
从第1行打印到/^B /(含)。 -n可以抑制默认回声。
更新:哎呀....不想 “布拉沃”,所以不是需要反向操作;-)
sed -n '/^B/,$!p'
/I3az/
这里是一个Perl的一个班轮:
perl -pe 'last if /B/' file
只是分享一些答案我已经收到:
打印数据开始在第一行,并继续下去,直到我们找到了匹配的正则表达式,然后停止:
个<command> | perl -n -e 'print "$_" if 1 ... /<regex>/;'
打印数据开始在第一行,并继续下去,直到我们找到了匹配的正则表达式,但不显示正则表达式匹配的行:
<command> | perl -pe '/<regex>/ && exit;'
做这在sed:
<command> | sed -n '1,/<regex>/p'
触发器操作符是我的最爱之一,这种情况是我使用它的几次之一。 :) –
由别人给出的一些sed
命令会在发现正则表达式后继续不必要地处理输入,这对于大量输入来说可能相当慢。这种退出时,正则表达式中发现:
sed -n '/^Bravo/q;p'
你的问题是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 $.
}
一个衬里与基本外壳命令:
head -`grep -n B file|head -1|cut -f1 -d":"` file
/B.*/将匹配任何含有B,不与B.起始 – rjh
这个问题并没有说'B'应该在一行的开头。 –
对不起,你是对的 - 这取决于我们在那里的解释。 – rjh