gpt4 book ai didi

regex - 一行打印两个图案之间的所有线条

转载 作者:行者123 更新时间:2023-12-03 22:19:45 25 4
gpt4 key购买 nike

使用一行 Perl 代码,打印两个模式之间的所有行(不包括带有模式的行)的最短方法是什么?

如果这是 file.txt:

aaa
START
bbb
ccc
ddd
END
eee
fff

我要打印这个:

bbb
ccc
ddd

我可以使用类似这样的方法完成大部分工作:

perl -ne 'print if (/^START/../^END/);'

不过,这包括 STARTEND 行。

我可以这样完成工作:

perl -ne 'if (/^START/../^END/) { print unless (/^(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)/);' 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 { } block 进行额外处理。对 END { } 使用 }{

perl -ne 'push @r, $_ if (/^START/../^END/); }{ print "@r[1..$#r-1]"' file.txt

工作,因为它只代表文件中的一个这样的片段。

关于regex - 一行打印两个图案之间的所有线条,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35933989/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com