这个问题与语言无关。仅使用正则表达式,我可以查找并替换文件中的重复行吗?
请考虑以下示例输入和我想要的输出;
输入>>
11
22
22 <-duplicate
33
44
44 <-duplicate
55
输出>>
11
22
33
44
55
Regular-expresss.info 有一个页面从文件中删除重复行
这基本上可以归结为寻找这个单行:
^(.*)(\r?\n\1)+$
... And replacing with \1
.
Note: Dot must not match Newline
解释:
The caret仅在行的开头匹配。因此,正则表达式引擎只会尝试匹配正则表达式的其余部分。这dot and star组合仅匹配整行,无论其内容如何(如果有)。括号将匹配的行存储到第一个反向引用中。
接下来我们将匹配行分隔符。我把问号 into \r?\n
使此正则表达式适用于两个 Windows (\r\n
) 和 UNIX (\n
) 文本文件。到目前为止,我们匹配了一行和下面的换行符。
现在我们需要检查该组合后面是否跟有同一行的重复项。我们简单地这样做\1
。这是保存我们匹配的行的第一个反向引用。反向引用将匹配完全相同的文本。
如果反向引用无法匹配,则丢弃正则表达式匹配和反向引用,并且正则表达式引擎在下一行的开头再次尝试。如果反向引用成功,则加号正则表达式中将尝试匹配该行的其他副本。最后,美元符号强制正则表达式引擎检查反向引用匹配的文本是否是完整的行。我们已经知道反向引用匹配的文本前面有一个换行符(由 \r?\n 匹配)。因此,我们现在使用以下命令检查它后面是否也跟着换行符或者是否位于文件末尾美元符号.
整场比赛变成line\nline
(or line\nline\nline
ETC。)。因为我们正在进行搜索和替换,所以该行、其重复项以及它们之间的换行符都将从文件中删除。由于我们想保留原始行,而不是重复行,因此我们使用\1
作为将原始行放回的替换文本。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)