如何显示从文件开头到第一次出现正则表达式的数据?
例如,如果我有一个包含以下内容的文件:
One
Two
Three
Bravo
Four
Five
我想从第1行开始显示文件的内容,并在找到字符串“B *”时停止。所以输出应该如下所示:
One
Two
Three
答案 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 -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