在 Notepad++ 中用末尾的一行替换相同的行

在 Notepad++ 中用末尾的一行替换相同的行

我能在 Notepad++ 中用一行替换末尾的相同行吗?例如来自:

1st January 2013
//some text1
1st January 2013
//some text2
1st January 2013
//some text3
1st January 2013

到:

//some text1
//some text2
//some text3
1st January 2013

另外,如果我有从 1 到 30 或 31 的所有日期,是否可以在它们最后一次出现时单独替换它们?

答案1

您可以在搜索和替换对话框中使用此正则表达式:

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

并将其替换为无。

您需要检查选项“正则表达式”和“。”匹配换行符”:

Notepad++ 替换对话框

正则表达式解释:

^匹配行的开头

(.*?)匹配任何字符 0 个或更多尽可能少。匹配的行被存储,因为括号括起来,可以使用\1

$匹配行尾

\s+?^此部分匹配所有空格字符(换行符!)直到下一个行的开头 ==> 这将删除换行符

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

答案2

您可以使用正则表达式查找和替换来实现这个 Sublime Text 2(或任何具有完整正则表达式支持的编辑器 - 遗憾的是不是 Notepad++)。

寻找:

^(([^\n]+\n)*)([^\n]+)\n(([^\n]+\n)*)\3(\n.*)*$

代替:

\1\4\3\6

继续点击“替换”,直到文档中重复的行被删除。“全部替换”在这里不起作用(或者您必须多次按下它)。


找到了一个更简单的解决方案,适用于 Notepad++ 以及其他编辑器。使用正则表达式模式查找并禁用“。匹配换行符”:

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

并替换为空。这是基于下面@stema的回答,但即使匹配的行是以下行的子字符串也有效:

1st January 2013
//some text1
1st January 2013
//some text2
1st January 2013
//some text3
21st January 2013

应该正确返回

//some text1
//some text2
1st January 2013
//some text3
21st January 2013

答案3

据我所知,在不使用任何插件的情况下,无法在 Notepad++ 中扫描重复行,但如果重复行具有已知格式,则可以更轻松地进行手动操作。例如,通过与正则表达式匹配,可以轻松找到格式为“2012 年 2 月 3 日”的日期(并将其替换为空字符串)^\d+[snrt][tdh] [A-Z][a-z]* 20\d\d$

作为这个答案解释得很好,插件 TextFX 通过其临时排序行的功能对这些过程特别有用。

相关内容