perl - 捕获独特的部分,无论出现偶数还是奇数

标签 perl

我有一个文本文件,其中反复出现一组特定的连续行。我需要修剪所有重复出现的情况,只打印第一个出现的情况。

输入:

$ cat log_repeat.txt
total bytes = 0, at time = 1190554
time window = 0, at time = 1190554
BW in Mbps = 0, at time = 1190554
total bytes = 0, at time = 1190554
time window = 0, at time = 1190554
BW in Mbps = 0, at time = 1190554
total bytes = 0, at time = 1190554
time window = 0, at time = 1190554
BW in Mbps = 0, at time = 1190554
total bytes = 0, at time = 1190554
time window = 0, at time = 1190554
BW in Mbps = 0, at time = 1190554
total bytes = 0, at time = 1190554
time window = 0, at time = 1190554
BW in Mbps = 0, at time = 1190554

$

下面的 Perl 解决方案仅在出现奇数情况时才有效,

$ perl -0777 -pe 's/(^total.*)\1//gms ' log_repeat.txt
total bytes = 0, at time = 1190554
time window = 0, at time = 1190554
BW in Mbps = 0, at time = 1190554

$

并且当出现偶数时不打印任何内容。无论该部分重复奇数次还是偶数次,如何获得第一次出现的结果。

最佳答案

贪婪地多次匹配你的 block ,只要后面跟着另一个 block

perl -0777 -wpe's/(total.*)+(?=\1)//s' log_repeat.txt

前瞻确保保留一个(最后一个),因为它不会消耗其匹配项。

或者,保留第一个匹配项,用 \K 丢弃它,并删除其他匹配项

perl -0777 -wpe's/(total.*?)\K\1+//s' log_repeat.txt

请注意,此处必须使用的 .*?.* 有所不同,但可能不实用。

关于perl - 捕获独特的部分,无论出现偶数还是奇数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54944259/

相关文章:

perl 不能使用字符串作为数组引用

perl - 为什么我对另一个 CGI 脚本的系统调用可以在命令行上运行,但在作为 CGI 程序运行时却不行?

java - 寻找一种更快的方法来执行字符串搜索

html - Mojo::DOM HTML 提取

Perl 面向对象编程 : Is it a good idea to outsource methods in your own modules

amazon-web-services - 使用 cpan 安装软件包

regex - 正则表达式 perl 抓取文本 block

perl - 在 perl 中用文件副本覆盖符号链接(symbolic link)

perl - 使用 Perl 确定非重叠位置

perl - Perl/e 修饰符的安全问题