使用一行Perl代码,什么是打印两个模式之间的所有行(不包括带有模式的行)的最短方法?
如果这是file.txt:
aaa
START
bbb
ccc
ddd
END
eee
fff
我要打印此:
bbb
ccc
ddd
我可以使用以下方法获得大部分信息:
perl -ne 'print if (/^START/../^END/);'
不过,其中包括START
和END
行。
我可以像这样完成工作:
perl -ne 'if (/^START/../^END/) { print unless (/^(START)|(END)/); };' file.txt
但这似乎是多余的。
我真正想做的是使用lookbehind和lookahead断言,如下所示:
perl -ne 'print if (/^(?<=START)/../(?=END)/);' file.txt
但这是行不通的,我认为我的正则表达式有些错误。
这些只是我尝试过的一些不产生任何输出的变体:
perl -ne 'print if (/^(?<=START)/../^.*$(?=END)/);' file.txt
perl -ne 'print if (/^(?<=START)/../^.*(?=END)/);' file.txt
perl -ne 'print if (/^(?<=START)/../(?=END)/);' file.txt
perl -ne 'print if (/^(?<=START)/../.*(?=END)/);' file.txt
perl -ne 'print if (/^(?<=START)/../^.*(?=END)/);' file.txt
perl -ne 'print if (/^(?<=START)/../$(?=END)/);' file.txt
perl -ne 'print if (/^(?<=START)/../^(?=END)/);' file.txt
perl -ne 'print if (/^(?<=START)/../(?=^END)/);' file.txt
perl -ne 'print if (/^(?<=START)/../.*(?=END)/s);' file.txt
读取整个文件,进行匹配并打印。
perl -0777 -e 'print <> =~ /START.*?\n(.*?)END.*?/gs;' file.txt
可能下降.*?
后,START|END
若单就行。然后放下\n
线段之间的空白行。
读取文件,按分割行START|END
,打印出奇数@F
perl -0777 -F"START|END" -ane 'print @F[ grep { $_ & 1 } (0..$#F) ]' file.txt
使用END { }
块进行额外处理。用途}{
为END { }
。
perl -ne 'push @r, $_ if (/^START/../^END/); }{ print "@r[1..$#r-1]"' file.txt
只能按文件中的单个此类段工作。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句