regex 在Notepad++中,如何选择所有部分重复的行并仅保留第一个示例?

wwodge7n  于 2023-10-22  发布在  其他
关注(0)|答案(1)|浏览(289)

有问题的行是那些有名字的行,然后在末尾引用时间。我要找出所有重名的线路。只保留时间戳最早的第一个示例,并删除所有其他示例。我不想删除有问题的行中的重复文本。我要整条线都撤了。所以当我完成时,每个剩余的条目将只有一个。我不能排序和删除重复的行,因为它们的位置必须保持在机智和下面的相应的轨道号码(除非有一种方法来处理这个问题后)。
到目前为止,这项任务是很容易做到的使用“删除重复”功能在Microsoft Excel。但是离开Notepad环境,复制出来,在Excel中进行编辑,然后复制回Notepad是一件麻烦的事情。它妨碍了我创建内部宏和在所有打开的文件中自动执行任务。有成千上万的文件需要完成这项任务,沿着还有许多其他编辑。我已经想出了如何从Notepad中完成其他所有事情,除了这个 * 壮举 *。我已经尝试了无数的正则表达式命令,书签技巧等。不行。几个星期来,我一直试图把Excel抛在脑后,想办法在Notepad中做到这一点。如果重复项都是按顺序排列的,一行接一行,我就可以做得很好。但事实并非如此。

以下是一个例子:

之前

Track 1    Retakes
        E07-P09 - Retake    00:00:12:370
        E07-P09 - Retake    00:00:14:572
        E07-P09 - Retake    00:00:17:711
        E07-P09 - Retake    00:00:22:388
        E07-P09 - Retake    00:00:23:939
        E07-P09 - Retake    00:00:30:218
        E07-P09 - Retake    00:00:32:177
Track 2    Med Signals
        TV Effect    00:03:35:983
        TV Effect    00:03:37:743
        TV Effect    00:04:18:848
        Dio Effect   00:04:17:607
        TV Effect    00:08:07:754
        TV Effect    00:08:37:808
        Dio Effect   00:08:37:567
Track 3    Rad Tuning
        Tuning NF HQ    00:10:46:358
Track 4    Super Clips
        Colde Square - Mentality    00:03:37:935
        Colde Square - Mentality    00:08:08:465
Track 5    Audi Bed
        Royal Fade into Grey    00:00:00:000
        The Sidas    00:04:19:535
        Royal Fade into Grey    00:08:39:400

之后

Track 1    Retakes
        E07-P09 - Retake    00:00:12:370
Track 2    Med Signals
        TV Effect    00:03:35:983
        Dio Effect    00:04:17:607
Track 3    Rad Tuning
        Tuning NF HQ    00:10:46:358
Track 4    Super Clips
        Colde Square - Mentality    00:03:37:935
Track 5    Audi Bed
        Royal Fade into Grey    00:00:00:000
        The Sidas    00:04:19:535

每一部分都有制表符分隔,每行的开头有两个制表符,上面有时间戳。

olmpazwi

olmpazwi1#

已经有an answer解释了如何删除除了最后一行之外的所有重复行。我们可以稍微修改它,并应用一个小技巧,以便它适用于您的用例,即保留第一个。
首先,让我们把正则表达式变得更具体一些:

^\h+                   # Match a line that starts with some horizontal whitespaces
(.+?)                  # then a name, which we capture,
\h{2,}                 # then at least two more whitespaces
(?:\d\d:){3}\d{3}\R    # before a timestamp at the end of that line.
(?=                    # This line must be followed by
  (?:\h++.+\R)*?       # any number of lines, but only in the same section,
  \h+\1\h{2,}          # then a line which has the same name as what we captured.
)                      #

试试on regex101.com
然而,这仍然只保留了最后一行。很明显,让它反向工作的方法是颠倒行的顺序!Notepad++对此提供了内置支持(更多信息可以在this Super User question中找到):在顶部菜单中,找到 * 编辑 *,然后是 * 生产线操作 *,最后是 * 反转生产线顺序
最后总结:反转行顺序,将上面的正则表达式替换为空,然后将其反转回来。
应该注意的是,使用您选择的语言编写一个小脚本可能是一个更好的解决方案,因为脚本是自动化的,允许代码重用,并且比正则表达式更灵活。
设置应该看起来像这样(
替换为 * 为空):

相关问题