如果之前已经问过这个问题,我很抱歉,但不幸的是,关于这种事情有太多的问题,虽然它们都是相关的,但很多适用于一个实例的情况可能并不适用于另一个实例,所以这就是我的问题。
我有一个文件,其中包含正则表达式的 pdfgrep 输出,其中包含相当多的输出行。文本文件的格式如下:
/path/to/file_1/containing/regex/string regex_string_1
/path/to/file_1/containing/regex/string regex_string_1
/path/to/file_1/containing/regex/string regex_string_1
/path/to/file_2/containing/regex/string regex_string_1
/path/to/file_2/containing/regex/string regex_string_2
/path/to/file_3/containing/regex/string regex_string_2
/path/to/file_3/containing/regex/string regex_string_2
/path/to/file_3/containing/regex/string regex_string_3
/path/to/file_3/containing/regex/string regex_string_3
/path/to/file_3/containing/regex/string regex_string_3
/path/to/file_3/containing/regex/string regex_string_3
虽然 pdfgrep 在分离我试图从文件中提取的信息方面做得很好,但不幸的是,有大量重复的正则表达式字符串。通常删除重复的行对我来说不是问题,但我在这里遇到的问题是,虽然从原始文件中提取的正则表达式字符串是重复的,但它可能来自完全不同的文件。我只希望我为原始 pdfgrep 执行的正则表达式在列表中出现一次。我想删除该字符串的任何重复条目以及相关路径。我该怎么做?
答案1
要删除以重复值结尾的行,请替换
([^\s]+\s(.*\n))([^\s]+\s\2)+
和
\2
根据您的示例输入,我假设我们可以使用给定行中的第一个空格来划定应检查重复项的正则表达式与字符串其余部分之间的边界。如果此假设错误,您可以将该部分修改[^\s]+\s
为与字符串的第一部分(非重复部分)匹配的任何有效正则表达式。
第一组括号与我们要保留的第一行相匹配。
第二组括号与我们要检查是否为重复值的字符串匹配。
在第三组中,我们再次检查一个字符串,后跟一个空格,后跟我们在第二组括号中捕获的相同重复字符串。
+
对此进行了多次检查。
\2
仅用重复的字符串替换整个匹配项。
答案2
搜索: ^(.*)(\r?\n\1)+$
替换为: \2\r\1\r
或者
搜索: ^(.*)(\r?\n\1)+$
用。。。来代替: \1
或者
寻找:(?<=|^)([^,]*)(,\1)+(?=,|$)
或者
寻找:^(.*?)$\s+?^(?=.*^\1$)