不论出现偶数还是奇数的情况,都能捕获唯一的部分

时间:2019-03-01 12:01:01

标签: 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

$

,即使有偶发事件也不打印任何内容。不管该节重复奇数还是偶数,如何获得第一次出现的结果。

2 个答案:

答案 0 :(得分:2)

贪婪地多次匹配您的区块,只要后面紧接着所有

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

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

或者,保留第一个匹配项,方法是用\K丢弃它,然后删除其他匹配项

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

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

答案 1 :(得分:1)

问题在于替换s/(^total.*)\1//gms删除了成对的块。 您可以通过以下方式解决此问题:使用先行记录一次仅删除一个块:

perl -0777 -pe 's/(^total.*)(?=\1)//gms' log_repeat.txt