如何在Visual Studio Code中删除重复的行?


118

说您有以下文字:

abc
123
abc
456
789
abc
abc

我要删除所有“ abc”行,并保留其中一行。我不在乎排序。结果应该是这样的:

abc
123
456
789

Answers:


223

如果行的顺序不重要

如果还没有,请按字母顺序对行进行排序,然后执行以下步骤:(
基于以下相关问题:如何使用正则表达式从文件中查找和删除重复的行?

  1. Control+F

  2. 切换“替换模式”

  3. 切换“使用正则表达式”(带有.*符号的图标)

  4. 搜索字段中,输入^(.*)(\n\1)+$

  5. 在“ 替换为 ”字段中,键入$1

  6. 单击全部替换按钮(“全部替换”)。

如果行的顺序重要,那么您就无法排序

在这种情况下,请诉诸于VS Code之外的解决方案(请参阅此处),或者-如果您的文档不是很大,并且您不介意发送“全部替换”按钮,则-请按照前面的步骤进行操作,但是请按照步骤4和5进行操作输入以下内容:(
基于删除不重复的特定重复行

注意:禁止用于行数过多的文件(1000+);可能导致VS代码崩溃;在某些情况下可能会引入空白行。

  • 搜索((^[^\S$]*?(?=\S)(?:.*)+$)[\S\s]*?)^\2$(?:\n)?

  • 替换为$1

然后单击“全部替换”按钮,直到出现重复的事件

单击该按钮时,行数停止减少就足够了。导航到文档的最后一行以保持关注。


4
((^[^\S\r\n]*?(?=\S)(?:.*)+$)[\S\s]*?)^\2$(?:\r?\n)?使我的vscode崩溃了。...我在一个文件中查找229行。:(
Hickory420 '18

@ Hickory420我在我的机器上测试了1000行(20个字符长,随机),没有崩溃,但是实际上一次线程阻塞了100%cpu负载,每次通过几秒钟。是的,这对于大文件几乎不切实际。
Marc.2377

谢谢你 你能解释一下正则表达式吗^(.*)(\n\1)+$?删除重复的行后,我想查看csv中第一列重复的所有行,并想修改正则表达式。
Urvah Shabbir

1
哇,我觉得我对regex相当不错,这仍然让我震惊,好答案!!
electrovir

@UrvahShabbir,有关此正则表达式的解释在链接的Q&A中给出。我的唯一不同之处在于,\r?与其他答案略有不同。
Marc.2377

66

这是一个非常有趣的扩展:变压器

特征:

  • 独特的线条
  • 唯一行作为新文档
  • 过滤线
  • 将行过滤为新文档
  • 排序行
  • 按长度对行进行排序
  • 对齐光标
  • 对齐CSV
  • 紧凑的CSV
  • 复制到新文档
  • 选择线
  • 行为JSON
  • 修剪线
  • 将重复行计数为新文档
  • 巨集

要删除重复的行:

  • 从文档中删除重复的行

  • 如果没有选择,则在选择或当前块上运行

除了“ Unique Lines”命令外,我还没有做很多其他事情,但是看起来做得很好(包括尝试使用宏记录器!)。


26

添加到@ Marc.2377的回复中。

如果顺序很重要,并且您不在乎只保留重复的行的最后一行,那么如果您只想删除重复的非空行,则只需搜索以下正则表达式

^(.+\n)(?=(?:.*\n)*?\1)

如果您还想删除重复的空行,请使用*代替+

^(.*\n)(?=(?:.*\n)*?\1)

并一无所获。

填充的搜索和替换框的屏幕截图

这将占用一行,并尝试在前面找到更多(也许为0)行,然后再截取完全相同的行。它将删除拍摄的线。

这只是一个一次性的正则表达式。无需向垃圾邮件发送替换按钮。


非常简洁
Angus l

4
真好 我建议^(.+\n)(?=(?:.*\n)*?\1)改用它,因为您的正则表达式删除了一个空行,该行是不希望的。无论如何都支持。
3377年

好收获……OTOH:重复的空行也是重复的;)
Skeeve

1
@Skeeve拜托,这只是对您的有用回答以及为改善社区而付出的一切:)
Zaman

1
xxx(?=…)是一项前瞻性比赛。因此,可以确保“ xxx”后面的任何内容均与“…”匹配,但不会推进搜索。(?:…)只是一个不包含在括号中的括号。.*\n是(可能为空)行的模式。*表示可能有多行,甚至没有。该?星号后(*)方法,我们希望尽可能少的线路越好。由于\1遵循这一表达的影响是我们展望未来的所有不匹配的行\1,直到我们找到一个线匹配\1。我希望这一点很清楚。
Skeeve

22

我只是遇到了同样的问题,发现Visual Studio代码包“排序行”。有关详细信息,请参见Visual Studio代码市场(例如Sortlines)。

该程序包具有“对行进行排序(唯一)”选项,该选项对我有用。请注意行首/结尾处的所有空白。它们影响线是否被视为唯一。



1
扩展名似乎不再具有删除重复条目的功能。将其与@ Marc-2377 的答案结合起来似乎对我有用。
Dan Atkinson

12

安装DupChecker扩展,点击F1,然后输入“检查重复项”。

它将检查重复项,并询问是否要删除它们。


11

尝试查找并用正则表达式替换。

  • 找: ^(.+)((?:\r?\n.*)*)(?:\r?\n\1)$

  • 更换: $1$2

在第一组中可能会引入一些差异。


-3

实际上不在Visual Studio Code中,但如果可以,它将起作用。

  1. 打开一个新的Excel电子表格
  2. 将数据粘贴到列中
  3. 转到数据标签
  4. 选择数据列(如果还没有)
  5. 单击“ 删除重复项”(在中间部分)
  6. 单击OK以删除重复项。

正如您指定的Visual Studio Code一样,这不是最佳答案,但正如我所说:如果可行,它就可以了:)


通过提供可以直接从Visual Studio Code调用的脚本,可以使其更加相关。换句话说,可以自动执行此过程。我不知道是否可行,但是一个脚本会通过其公开的COM接口调用Excel。这将使此答案更有价值,因为它将成为利用其他应用程序完成工作的示例。
Peter Mortensen
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.