Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 如何显示从文件开头到正则表达式首次出现的数据?_Regex_Perl_Sed_Awk - Fatal编程技术网

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

Regex 如何显示从文件开头到正则表达式首次出现的数据?,regex,perl,sed,awk,Regex,Perl,Sed,Awk,如何显示从文件开头到正则表达式首次出现的数据 例如,如果我有一个包含以下内容的文件: One Two Three Bravo Four Five 我想开始显示文件的内容,从第1行开始,在找到字符串“B*”时停止。因此,输出应如下所示: One Two Three % perl -0ne 'if (/B.*/) { print $`; last }' INPUT_FILE 在Perl中: perl -nle '/B.*/ && last; print; ' source.t

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

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

One
Two
Three
Bravo
Four 
Five
我想开始显示文件的内容,从第1行开始,在找到字符串“B*”时停止。因此,输出应如下所示:

One
Two
Three
% perl -0ne 'if (/B.*/) { print $`; last }' INPUT_FILE
在Perl中:

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

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

如果可以使用Perl,可以执行以下操作:

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

如果是从文件的开头开始

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.*/#我们提供的位 印刷品; } 如果条件成立,最后一个关键字将立即退出周围循环-在本例中为“/^B/”,这表示该行以B开头

sed -n '1,/^B/p'
从第1行打印到/^B/(含)-n抑制默认回显


更新:Opps。。。。不需要“Bravo”,因此需要反向操作;-)


/I3az/

这里是一个perl单行程序:

perl -pe 'last if /B/' file

分享我收到的一些答案:

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

<command> | perl -n -e 'print "$_" if 1 ... /<regex>/;'
| perl-n-e'如果1…/;,则打印“$”
从第一行开始打印数据,然后继续打印,直到找到与正则表达式匹配的行,但不显示与正则表达式匹配的行:

<command> | perl -pe '/<regex>/ && exit;'
| perl-pe'/&&exit;'
在sed中执行此操作:

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

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

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

您的问题是中答案的变体:


您可以使用Perl的一些异国情调。。操作员(记录在perlop中):

如果您想要文本而不是行,您可以使用

perl -0777 -ne 'print "$1\n" while /START(.*?)END/gs' file1 file2 ...
但是,如果希望从开始到结束嵌套出现,您将遇到本节关于匹配平衡文本的问题中描述的问题

下面是使用..的另一个示例:

while (<>) {
    $in_header =   1  .. /^$/;
    $in_body   = /^$/ .. eof;
# now choose between them
} continue {
    $. = 0 if eof;  # fix $.
}
while(){
$in_header=1../^$/;
$in_body=/^$/…eof;
#现在在他们之间选择
}继续{
如果eof;#fix$,则$.=0。
}

一个带有基本shell命令的线性程序:

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

/B.*/将匹配任何包含B的内容,而不是以B开头。问题没有说明“B”应位于行的开头。将在结尾自动显示-p而不是-n。:)不幸的是,这个打印包括“Bravo”行,而问题想要排除“Bravo”行。Arghh!。。。没有正确阅读问题。对于不在/^B/和文件结尾之间的所有内容,使用反向操作“!p”(即打印!)进行更新。非常感谢您发现这个ndim<代码>修改地址范围,使其仅匹配不匹配的位置,反之亦然。它仍然是地址范围的一部分。嗯,
对我来说是新的。。。谢谢你给我指点。退出会不会更好,这样它就不会读得比需要的更远?触发器操作符是我的最爱之一,这种情况是我使用它的少数几次之一。:)在做任何事情之前将整个文件读入内存似乎太过分了。
head -`grep -n B file|head -1|cut -f1 -d":"` file