如何删除Visual Studio代码中的重复行?

You*_*nes 87 visual-studio-code

假设您有以下文字:

abc
123
abc
456
789
abc
abc
Run Code Online (Sandbox Code Playgroud)

我想删除所有"abc"行,只保留一行.我不介意排序.结果应该是这样的:

abc
123
456
789
Run Code Online (Sandbox Code Playgroud)

Mar*_*377 162

如果线的顺序不重要

按字母顺序排序行(如果尚未按行排序),并执行以下步骤:(
基于此相关问题:如何使用正则表达式查找和删除文件中的重复行?)

  1. Control+F

  2. 切换"替换模式"

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

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

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

  6. 点击 全部替换按钮 ("全部替换").

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

在这种情况下,要么使用VS Code以外的解决方案(请参阅此处),要么 - 如果您的文档不是很大并且您不介意将"全部替换"按钮发送垃圾邮件 - 请按照前面的步骤操作,但在步骤4和5中,输入以下内容:(
基于删除特定的重复行而不进行排序)

警告:具有太多行(1000+)的文件的块; 可能导致VS Code崩溃; 在某些情况下可能会引入空行.

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

  • 替换为:$1

然后单击"全部替换"按钮,因为重复出现次数.

单击按钮时,当行数停止减少时,您就会知道它已足够了.导航到文档的最后一行以关注它.

  • `((^ [^\S\r \n]的*(=\S)(:???.*)+ $)\ S\S]*?)^\2 $(?:吗?\ r \n)?`让我的vscode崩溃....我在一个文件中做了229行查找.:( (4认同)
  • 当 Sublime 中的基本“编辑>删除重复项”时,我们必须做一些复杂的事情,这太疯狂了...... (3认同)
  • 哇,使用正则表达式捕获组进行替换是如此有用!谢谢 (2认同)

Mar*_*ark 37

这是一个非常有趣的扩展:变形金刚

特征:

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

删除重复行:

  • 从文档中删除重复的行

  • 如果没有选择,则在选择或当前块上操作

除了"Unique Lines"命令之外,我还没有玩过它,但它看起来相当不错(包括尝试一个宏录音机!).

  • 感谢您提到“精选”。我想知道为什么什么都没有发生...... (2认同)

Sim*_*nAx 20

刚刚遇到同样的问题并发现了VSCode包"Sort lines",详见VSCode市场(例如https://marketplace.visualstudio.com/items?itemName=Tyriar.sort-lines).

这个包有"排序行(唯一)"选项,它为我做了.处理线条开头/结尾处的任何空白区域,它们会影响线条是否被视为唯一线条.

  • https://marketplace.visualstudio.com/items?itemName=bibhasdn.unique-lines 也应该有效。 (2认同)

Ske*_*eve 14

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

如果顺序很重要,并且您不在乎只保留最后一行重复的行,只需搜索regexp

^(.*\n)(?=(?:.*\n)*?\1)
Run Code Online (Sandbox Code Playgroud)

并一无所获。

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

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

  • 真好 我建议使用^(。+ \ n)(?=(?:。* \ n)*?\ 1)代替,因为您的regex删除了一个空行,这是不希望的。无论如何都支持。 (2认同)
  • 很好……OTOH:重复的空行也是重复的;) (2认同)
  • @Skeeve 来吧,这只是一点感谢您的有用答案&一切都是为了更好的社区:) (2认同)
  • `xxx(?=...)` 是一个前瞻匹配。因此它确保“xxx”后面的任何内容都匹配“...”,但不会推进搜索。`(?:...)` 只是一个括号,不计入括号计数。`.*\n` 是一个(可能是空的)行的模式。“*”表示可能有几行,甚至没有。星号 (`*`) 后面的 `?` 表示我们需要尽可能少的行。由于“\1”跟随在这个表达式之后,效果是我们向前查找所有不匹配“\1”的行,直到找到匹配“\1”的行。我希望这能够清楚地表明这一点。 (2认同)
  • 这个答案对我有用。请记住在搜索之前,在最后给出一个空行,否则无法捕获最后一行匹配 (2认同)

Lav*_*ock 9

尝试使用regexp查找和替换.

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

  • 替换: $1$2

可以在第一组中引入一些变化.


per*_*o25 9

安装DupChecker扩展,点击F1,输入"Check Duplicates".

它将检查欺骗并询问您是否要删除它们.


fal*_*ick 5

如果你不介意 VS Code 中加入一些 Vim。您可以安装 Vim 模拟插件。

然后就可以使用vim命令了

:sort u
Run Code Online (Sandbox Code Playgroud)

它将对行进行排序并删除重复项