gpt4 book ai didi

regex - 如何保留与 Perl 匹配的最后一行

转载 作者:行者123 更新时间:2023-12-01 12:47:24 30 4
gpt4 key购买 nike

我正在尝试匹配文本文件中连续的相似行,并且只保留最后一行。每行包含一个数字计数,因此我匹配文本和数字以获得计数。

例如,如果我有很多连续的行带有字符“a”,我设法按如下方式进行。

$ (for i in `seq 1 1 100000`; do echo a; done;) | 
perl -0777 -pe 's/(a\n)*(a\n)/\2/igs'
a

但是如果我将它与额外的数字匹配一起使用,perl 似乎会以 2^15 为一组进行处理。

$ (for i in `seq 1 1 100000`; do echo $i; done;) | 
perl -0777 -pe 's/(\d*\n)*(\d*\n)/\2/igs'
32768
65536
98304
100000

我是不是做错了什么,这是 perl 中的错误,还是在某处记录了它?最好的方法是什么?

我正在使用 perl 5.22.1。

最佳答案

如果您将警告编译指示添加到您的 perl 脚本中,您将获得以下信息:

Complex regular subexpression recursion limit (32766) exceeded at -e line 1, <> chunk 1.

根据 perldiag :

Complex regular subexpression recursion limit (%d) exceeded (W regexp)

The regular expression engine uses recursion in complex situations where back-tracking is required. Recursion depth is limited to 32766, or perhaps less in architectures where the stack cannot grow arbitrarily. ("Simple" and "medium" situations are handled without recursion and are not subject to a limit.) Try shortening the string under examination; looping in Perl code (e.g. with while ) rather than in the regular expression engine; or rewriting the regular expression so that it is simpler or backtracks less. (See perlfaq2 for information on Mastering Regular Expressions.)

这是您可以使用的解决方案:

perl -ne'
if (/^\d+\n) { $buf = $_; next; }
print(substr($buf, 0, -1, ""), $_);
END { print($buf) }
'

关于regex - 如何保留与 Perl 匹配的最后一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52612121/

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