如何删除记事本++中的重复行?我看到了一些例子,但许多例子已经有很多年了,现在解决方案不起作用。
说我有:
Example
Example
1
1
3
Run Code Online (Sandbox Code Playgroud)
期望:
Example
1
3
Run Code Online (Sandbox Code Playgroud)
我在 32 位记事本 ++ 或 TextFx 工具中似乎没有插件管理器
Ana*_*man 21
我提供了几种可能的解决方案供您考虑。如果我重述你已经知道的任何事情,请原谅我。=)
TL; 博士
从 Notepad++ v7.7.1 开始,Notepad++ 有一个名为Remove Consecutive Duplicate Lines 的功能,它与下面给出的其他两个解决方案执行相同的操作(即它删除连续的重复行)。
可以使用Edit访问它?线路操作 ? 删除连续的重复行。
请参阅下面的Bartleby 的回答,以获取在不进行排序的情况下对行进行重复数据删除的正则表达式示例。
原答案
根据@máté-juhász 的评论,此StackOverflow 问题的已接受答案将适用于您的示例数据。
在本质上:
打开搜索?在 Notepad++ 中替换... ( Ctrl+ H)。
在“查找内容:”字段下,输入以下正则表达式:
^(.*?)$\s+?^(?=.*^\1$)
Run Code Online (Sandbox Code Playgroud)
将“替换为:”字段留空,并确保在“搜索模式”选项下标记“正则表达式”。
准备好删除行后,单击“全部替换”。
请注意,原始答案似乎表明. matches newline应该选中该选项,但评论中的某些人显然没有选中它的运气更好。对于您的数据,我未选中它,它似乎运行良好。
前任。使用正则表达式
使用 uniq
作为替代方案,假设没有其他选项适合您的需求,如果您有基于 Unix 的uniq实用程序的 Windows 端口,您可以使用 Notepad++ 将其集成到您的工作流程中。
简而言之,uniq执行与上述正则表达式相同的功能,但可能以更可靠的方式执行。缺点是将它与 Notepad++ 结合起来有点麻烦。考虑到这一点,如果您想试一试,下面概述了基本步骤。
获得 uniq
首先,您需要一份uniq适用于 Windows的副本。可能有几个选项可供您使用,但为简单起见,我可能建议使用GnuWin32 CoreUtils 包,其中包含uniq. 如果您选择不自行下载和组合 CoreUtils 软件包组件的压缩版本,您目前可以下载轻量级安装程序。
作为提示,对于涉及 的解决方案中的每一步uniq,我都会跳过使用带空格的路径。Unix 通常以不同于 Windows 的方式处理目录名称中的空格,因此从该环境移植的实用程序可能会出现问题。
作为参考,我不确定什么(如果有)文件大小限制可能适用于uniq.
在 Notepad++ 中使用 uniq
一旦uniq被安装,类似于一个批处理文件以下行地方的东西:
C:\path\to\uniq.exe %* > C:\temp\uniq_tmp.txt
notepad++ C:\temp\uniq_tmp.txt
exit()
Run Code Online (Sandbox Code Playgroud)
将此批处理文件保存在您熟悉的永久目录中。出于参考目的,我将其称为uniq_npp.bat。请注意,“temp”可以是任何文件夹,但 Windows 上通常已经存在“tmp”和“temp”。同样,“uniq_tmp.txt”可以是您想要的任何名称,只要它被一致使用即可。
保存uniq_npp.bat 后,我们准备将其功能集成到 Notepad++ 中。为此,请打开 Notepad++ Run...菜单 ( F5) 并在出现的字段中输入类似于以下内容的内容:
cmd /k C:\path\to\uniq_npp.bat "$(FULL_CURRENT_PATH)"
Run Code Online (Sandbox Code Playgroud)
如果单击最左侧的“运行”按钮,则可以在保存之前测试 Notepad++ 命令。
前任。运行...对话框
否则,单击“保存...”并适当命名您的命令。如果你愿意,你可以给它一个键盘快捷键,但这不是必需的。单击“确定”保留您的命令设置并将其放置在“运行...”下拉菜单中以供以后使用。
前任。运行下拉菜单
假设您对它感兴趣,我uniq在本答案末尾的“注释”部分对解决方案如何工作的细节进行了非常简要的概述。
注意事项
关于此解决方案要记住的一件重要事情uniq是它绝对需要保存在磁盘上的文件的路径(该文档不能仅在 Notepad++ 中打开)。
这不是您打开的现有文件的问题,但如果您创建新文件或更改现有原始文件,则需要先保存它,然后再运行uniq_npp.bat文件。否则,操作将失败并且不会对任何新数据进行排序。
作为一个小优势,可能值得一提的是,此保存限制不适用于上面的正则表达式选项。
笔记
排序
提供的解决方案(即初始正则表达式 和uniq)都需要重复的行直接出现在彼此之上才能删除,例如:
duplicate line X
duplicate line X
Run Code Online (Sandbox Code Playgroud)
这意味着在应用这些操作之一之前对数据进行排序很重要。鉴于您的示例数据,我假设您已经这样做了,但无论如何都值得一提。
记事本++宏
作为一个小建议,由于 Notepad++ 的内置行排序操作没有任何实际的键盘快捷键,您可能需要录制一个宏来帮助排序。特别是,您可以录制Edit ? 全选( Ctrl+ A) 操作,然后选择编辑?线路操作 ? 按字典顺序排序行选项。
对于uniq解决方案,可能还值得考虑将“保存”操作记录为排序宏的最后一步。另请注意,正则表达式选项的步骤(打开替换对话框、输入正则表达式等)也可以记录到方便的宏中。
uniq 解决方案的工作原理
简单来说:
“运行...”行生成一个命令窗口 ( cmd /k),调用uniq_npp.bat并为其提供您选择的当前文件存储位置的路径。
在uniq_npp.bat 中,此路径是通过%*传递给的通配符捕获的uniq。去重后的数据uniq然后被重定向 ( >) 到“uniq_tmp.txt”。
最后,批处理文件在新的 Notepad++ 选项卡中打开这个清理过的文本,并通过exit().
uniq_npp.bat 改进 (?)
关于排序,另一种选择是跳过使用 Notepad++ 对所有内容进行排序。您可能会在排序选项的过程中失去一些灵活性,但您可以通过Windows 排序命令将项目作为批处理文件中的一个额外步骤进行排序。添加这一步可以修改uniq_npp.bat的第一行如下:
sort %* | C:\path\to\uniq.exe > C:\temp\uniq_tmp.txt
Run Code Online (Sandbox Code Playgroud)
这只是将排序的数据从sort到管道uniq。如您所见,sort现在最初捕获数据路径,而不是uniq.
另一个想法是(可能)使用%*通配符作为字符串操作的一部分来获取原始文件名,并将例如“uniq_tmp.txt”替换为“original-filename_uniq.txt”之类的内容,使其更加......独特。
潜在的陷阱
默认情况下,Windowssort会将数字排序为例如
1
11
2
21
Run Code Online (Sandbox Code Playgroud)
如果它们前面没有 0(例如01, 02, 011, 021)。
sort),但这个特定的实现(与大多数 GnuWin32 实用程序不同)让我觉得在 Windows 上有点糟糕。但是,如果您使用 Unix 版本的不同 Windows 端口,则sort此问题可能不适用,并且可能被证明是总体上更好的选择。