![在 Notepad++ 中用末尾的一行替换相同的行](https://linux22.com/image/1361575/%E5%9C%A8%20Notepad%2B%2B%20%E4%B8%AD%E7%94%A8%E6%9C%AB%E5%B0%BE%E7%9A%84%E4%B8%80%E8%A1%8C%E6%9B%BF%E6%8D%A2%E7%9B%B8%E5%90%8C%E7%9A%84%E8%A1%8C.png)
我能在 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$)
并将其替换为无。
您需要检查选项“正则表达式”和“。”匹配换行符”:
正则表达式解释:
^
匹配行的开头
(.*?)
匹配任何字符 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 通过其临时排序行的功能对这些过程特别有用。