我有一个文本文件,其中反复出现一组特定的连续行。我需要修剪所有重复出现的情况,只打印第一个出现的情况。
输入:
$ 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/