【问题标题】:Removing duplicate rows in Notepad++删除记事本++中的重复行
【发布时间】:2011-04-26 21:06:33
【问题描述】:

是否可以在 Notepad++ 中删除重复的行,只留下一行?

【问题讨论】:

    标签: duplicates notepad++


    【解决方案1】:

    如果您不关心行顺序(我认为您不关心),那么您可以使用 Linux/FreeBSD/Mac OS X/Cygwin 机器并执行以下操作:

    $ cat yourfile | sort | uniq > yourfile_nodups
    

    然后在 Notepad++ 中再次打开文件。

    【讨论】:

    • 不适用于 Windows 7。'cat' is not recognized as an internal or external command, operable program or batch file.
    • @Iain Elder:cat 是一个标准的 Unix 实用程序,这就是为什么这个答案指定它适用于 linux、FreeBSD 和 MacOSX。答案还建议 Cygwyn:这是一个 Windows 程序,它为您提供了一个 unix 样式的 shell,还有 cat。长话短说(为时已晚!):Win 7 需要 Cygwin 来做到这一点。
    • 在windows中你有powershell:cat yourfile | sort -Unique
    • 这些都是“无偿使用猫”的好例子。忘记 cat 实用程序,只使用文件重定向:sort | uniq > yourfile_nodups
    • @scott8035,我同意 cat 对运行该命令没有用处,但我发现在找出一长串非显而易见的命令时,从 cat 开始通常很有帮助,比如 cat file | sed ... | sed ... | sed ...等等。所以我会说使用 cat 可能是有原因的。当然 cat 可以在最后被删除,但有些人太懒了。
    【解决方案2】:

    带有 TextFX 插件的 Notepad++ 可以做到这一点,前提是您想按行排序并同时删除重复的行。

    要在最新版本的 Notepad++ 中安装 TextFX,您需要从此处下载:https://sourceforge.net/projects/npp-plugins/files/TextFX

    TextFX 插件曾经包含在旧版本的 Notepad++ 中,或者可以通过转到 Plugins -> Plugin Manager -> Show Plugin Manager -> Available tab -> TextFX -> Install 从菜单中添加。在某些情况下,它也可能被称为TextFX Characters,但这是同一回事。

    所需的复选框和按钮现在将显示在以下菜单中:TextFX -> TextFX Tools

    确保选中“仅对唯一输出排序...”。接下来,选择一个文本块(Ctrl+A 选择整个文档)。最后,点击“排序行区分大小写”或“排序行不区分大小写”

    【讨论】:

    • 令人难以置信的强大插件,尽管它的“年龄”。希望他们永远不会从标准 NPP 插件产品中删除该插件。考虑过这个插件所有功能的人,有点“有远见”。
    • 比excel更强大。
    • Notepad++ x64 版本怎么样?插件 TextFX x64 版本不存在
    • TextFx 不是 64 位版本。
    • @Geograph 并且不会有 TextFx 的 64 位插件,请参见 note。因此,最好知道是否有提供排序和重复删除的替代插件。
    【解决方案3】:

    如果行是紧挨着的,那么您可以使用正则表达式替换:

    搜索模式:^(.*\r?\n)(\1)+

    替换为:\1

    【讨论】:

    • 也许其他人对此很幸运,但对我来说 ^(.*\n)\1 导致“找不到文本”
    • @b1naryatr0phy 确保您将“搜索模式”设置为“正则表达式”,我还更新了模式以便它可以处理 windows 样式的行尾
    • notepad++ 有一个轻量级的正则表达式引擎,它不允许高级功能,甚至 "? 或 \r\n" 因为它只适用于单行并且您使用 $ 作为 \r \n 个字符
    • 这样一一消除。你必须重复很多次。我想知道为什么 \n+ -> \n 不起作用(认为它报告了很多替换)
    • @Val,如果您将匹配的反向引用部分设为需要 1 个或多个匹配的组,则该模式将一次匹配 N 个连续重复行:^(.*\r?\n)(\1)+跨度>
    【解决方案4】:

    Notepad++ 的后期版本显然根本不包含 TextFX 插件。为了使用插件进行排序/消除重复,插件必须下载并安装(更多涉及)或使用插件管理器添加。

    A) 简单的方法(如here 所述)。

    插件 -> 插件管理器 -> 显示插件管理器 -> 可用选项卡 -> TextFX 字符 -> 安装

    B) 更复杂的方式,如果需要另一个版本或简单的方法不起作用。

    1. 从 SourceForge 下载插件:

      http://downloads.sourceforge.net/project/npp-plugins/TextFX/TextFX%20v0.26/TextFX.v0.26.unicode.bin.zip

    2. 打开 zip 文件并解压 NppTextFX.dll

    3. NppTextFX.dll放在Notepad++插件目录下,如:
      C:\Program Files\Notepad++\plugins

    4. 启动 Notepad++,TextFX 将成为文件菜单项之一(如 Colin Pickard 上面的答案 #1 所示)

    安装 TextFX 插件后,按照答案 #1 中的说明对重复项进行排序和删除。

    此外,如果您经常使用此命令或想要复制键盘快捷键(例如 TextPad 中的 F9 进行排序),请考虑使用 Settings > Shorcut mapper 设置键盘快捷键。

    【讨论】:

    • 在notepad++ 7.6中,插件应该添加到C:\Users\<your_user>\AppData\Local\Notepad++\plugins\NppTextFX。除此之外,这仍然可以正常工作。
    【解决方案5】:

    从 Notepad++ 版本 6 开始,您可以在搜索和替换对话框中使用此正则表达式:

    ^(.*?)$\s+?^(?=.*^\1$)
    

    并且什么都不替换。这会从所有重复行中保留文件中的最后一次出现。

    不需要排序,重复的行可以在文件中的任何位置!

    需要勾选“正则表达式”和“.matches newline”选项:

    • ^ 匹配行首。

    • (.*?) 匹配任何字符 0 次或多次,但尽可能少(它完全匹配行,这是必需的,因为 ".matches newline" 选项)。匹配的行被存储,因为使用\1 来访问和访问括号

    • $ 匹配行尾。

    • \s+?^这部分匹配所有空白字符(换行符!)直到下一行的开始 ==> 这将删除匹配行之后的换行符,因此替换后没有空行。

    • (?=.*^\1$) 这是一个积极的前瞻断言。这是此正则表达式中的重要部分,只有当文件中的其他位置有完全相同的行时,才会匹配(并删除)行。

    【讨论】:

    • 哦,这个太棒了,它甚至可以删除空行,我现在正在宏化它:)
    • 在某些情况下它只是删除文件中的所有行。
    • 有什么办法可以去掉最后一次出现的吗?这匹配除最后一个之外的所有...
    • 在我的情况下,这个解决方案删除了​​所有行,取消选中 . matches newline 就可以了。
    • @SerG 在某些情况下它对我也不起作用,但是当我删除“匹配换行符”时它确实起作用了:)
    【解决方案6】:

    搜索正则表达式:\b(\w+)\b([\w\W]*)\b\1\b

    替换为:$1$2

    点击替换按钮,直到文件中的正则表达式不再匹配为止。

    【讨论】:

    • 创建了一个测试文件来尝试这个,但是正则表达式不能可靠地完成工作。
    • 能否提供一个失败的例子,以便我改进我的答案?
    • 删除重复项,同时保留其他文本的原始行号位置,我喜欢这个解决方案
    【解决方案7】:

    没有一个对我有用。

    解决办法是:

    替换

    ^(.*)\s+(\r?\n\1\s+)+$
    

    \1
    

    【讨论】:

    • 创建了一个测试文件来尝试这个,但是正则表达式不能可靠地完成工作。
    • 对于我所有的数据,它运行良好。我忘记了我的解决方案是什么。在失败的地方添加更多详细信息,以便其他人可以改进此正则表达式。
    • 我创建了一个文件,所以每一行都有一个 0-999 之间的整数,以随机顺序排列,有时有重复。它没有删除大部分重复项,也没有删除任何不连续的重复项。
    • 请务必提供 2 个工作示例和不工作示例。它会帮助某人。
    • 为什么是^(.*)\s+(\r?\n\1\s+)+$ 而不是^(.*)\s*(\r?\n\1\s*)+$
    【解决方案8】:

    记事本++

    -> 替换窗口

    确保在搜索模式下您选择了正则表达式单选按钮

    查找内容:

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

    替换为:

    $1

    之前:

    我们认为有

    我们认为有

    单行

    可以吗

    可以吗

    之后:

    我们认为有

    单行

    可以吗

    【讨论】:

    • 文件是否需要排序才能正常工作?
    【解决方案9】:

    Notepad++ 的插件管理器当前不可用(不随发行版提供)。您必须手动安装它 (https://github.com/bruderstein/nppPluginManager/releases),即使您这样做,很多插件也不再可用(没有 TextFX)插件。

    也许有另一个插件包含所需的功能。除此之外,在 Notepad++ 中做到这一点的唯一方法是使用一些特殊的 regex 进行匹配然后替换 (Ctrl + F → 替换标签)。

    虽然编辑菜单项提供了许多功能(修剪、删除空行、排序、转换 EOL),但没有“独特”的操作可用。

    如果您有 Windows 10,那么您可以启用 Bash(只需在 Microsoft Store 中输入 Ubuntu 并按照说明中的说明进行安装)并使用 cat your_file.txt | sort | uniq > your_file_edited.txt。当然你必须和“your_file.txt”在同一个工作目录下或者通过它的路径引用它。

    【讨论】:

      【解决方案10】:

      您可能需要一个插件来执行此操作。你可以试试ConyEdit的命令行cc.ddl(删除重复行)。它是文本编辑器的交叉编辑器插件,包括 Notepad++。

      ConyEdit 在后台运行,请按照以下步骤操作:

      1. 在文本末尾输入命令行cc.ddl
      2. 复制文本和命令行。
      3. 粘贴,然后你会看到你想要什么。

      示例

      【讨论】:

        【解决方案11】:

        在 7.8 版中,您无需任何插件即可完成此操作 - 编辑 -> 行操作 -> 删除连续重复行。在此工作之前,您必须对文件进行排序以将重复的行按连续顺序放置,但它确实像魅力一样工作。

        编辑 -> 行操作 -> 排序方式下提供排序选项...

        【讨论】:

        • 现在还有一个选项用于编辑 -> 行操作 -> 删除重复行,从而消除了排序的需要。
        • “删除重复行”和“删除连续重复行”有什么区别
        • 第一个选项应该删除文档中每个匹配行中除一个之外的所有匹配行(因此 a、a、b、a、c 将变为 a、b、c)。第二个选项应该只删除在匹配行之后立即重复的行(a、a、b、a、c 将变为 a、b、a、c)。
        【解决方案12】:

        截至目前,可以使用记事本内置功能删除所有连续重复行。先对行进行排序:

        编辑 > 行操作 > “按字典顺序排列行”,

        然后

        编辑 > 行操作 > “删除连续的重复行”。

        上面建议的正则表达式解决方案并没有为我删除所有重复的行,而只是删除了连续的行。

        【讨论】:

          【解决方案13】:

          无论文件是否已排序,您都可以使用下面的正则表达式来删除文件中出现的任何重复项。

          查找内容:^([^\r]*[^\n])(.*?)\r?\n\1$
          替换为:\1\2
          搜索模式:

          • 正则表达式
          • 选中“。匹配换行符”选项

          尽可能多地执行“全部替换”,直到您看到“0 次出现已替换”

          【讨论】:

          • 我喜欢这个,因为您不必先对文件的内容进行排序。它也可以用于任何支持 Perl 正则表达式的文本编辑器。
          【解决方案14】:

          在 NPP 中很难做到这一点。 更好的方法如下:

          下载cygwin实用程序,它是windows下的简单Linux终端。 它允许在 Windows 中执行任何 Linux 命令。 你有 sort -u 那里。

          【讨论】:

          • 为什么难?你见过其他答案吗?他们怎么了?
          【解决方案15】:

          从 Notepad++ 8.1 版开始,有一个特定的命令可以准确地完成这个热门问题的要求。 On 可以使用菜单命令Edit > Line Operations > Remove Duplicate Lines 删除文本文件中的重复行。

          无需安装插件(如当前接受的答案所建议的那样),或预先对行进行排序,或按照其他答案的建议在替换对话框中使用正则表达式语法。

          【讨论】:

          • 这是完美的解决方案,节省了我大量使用 Excel 并执行基于 Einstein 的操作的时间。
          猜你喜欢
          • 2014-03-03
          • 2015-05-16
          • 2014-01-11
          • 1970-01-01
          • 2016-05-07
          • 2013-07-18
          • 1970-01-01
          • 2016-05-21
          相关资源
          最近更新 更多