如何在Notepad++上删除每三行?

6

我有这样的文本:

每行都是新的:

tom
tim
john
will
tod
hello
test
ttt
three

我想删除每三行数据,以上例为例,我想删除:john,hello,three

我知道这需要使用一些正则表达式,但是我不太擅长!

我尝试过:

Search: ([^\n]*\n?){3} //3 in my head to remove every third
Replace: $1

我尝试过其他的方式,比如使用\n\r等。但我对正则表达式掌握得不是很好。我认为前面的尝试已经很接近了。

2
分享你的研究可以帮助每个人。告诉我们你尝试过什么以及为什么不符合你的需求。这表明你已经花时间尝试自己解决问题,它可以避免我们重复显而易见的答案,最重要的是它可以帮助你获得更具体和相关的答案!另请参阅:[ask] - Thomas Ayoub
1
对我有用。我在Ubuntu上使用gedit。我使用(.*?)\n(.*?)\n(.*)\n进行搜索,并用\1\n\2\n替换它。 - Sahil Gulati
4个回答

9
这将删除可能包含多个单词的每第三行。
  • Ctrl+H
  • 查找内容: (?:[^\r\n]+\R){2}\K[^\r\n]+(?:\R|\z)
  • 替换为: LEAVE EMPTY
  • 勾选 Wrap around
  • 勾选 正则表达式
  • 全部替换

解释:

(?:             # start non capture group
  [^\r\n]+      # 1 or more non linebreak
  \R            # any kind of linebreak (i.e. \r, \n, \r\n)
){2}            # end group, appears twice (i.e. 2 lines)
\K              # forget all we have seen until this position
[^\r\n]+        # 1 or more non linebreak
(?:             # start non capture group
  \R            # any kind of linebreak (i.e. \r, \n, \r\n)
 |              # OR
  \z            # end of file
)               #end group

给定示例的结果:

tom
tim
will
tod
test
ttt

屏幕截图:

输入图片描述

演示


非常好的解释,但在处理非常大的文件时需要一些时间。 - user3352632

7

gedit ubuntu

搜索: (.*?)\n(.*?)\n(.*)\n
替换为: \1\n\2\n


1
由于OP说Sahil的答案“非常有效”,我将假设notepad++中的文本以换行符结尾。否则,Sahil和Toto的答案将无法匹配最终的一组单词。
Sahil的模式:(.*?)\n(.*?)\n(.*)\n 如果文本以\n结尾,则需要79步; 否则112步并失败。
他的替换表达式不必要地���用了两个捕获组引用。
Toto的模式:((?:[^\r\n]+\R){2})[^\r\n]+\R 如果文本以\n结尾,则需要39步; 否则173步并失败。 他的替换表达式使用了一个捕获组引用。
我建议使用的模式仅需要25步,并且不使用任何捕获组。 您的文本是一系列非空白字符后跟空白字符,因此以下是提供最大速度的最短、最准确的模式:
\S+\s+\S+\s+\K\S+\s*

这个模式应该与空替换配对使用。

\S 表示 "非空白字符"
\s 表示 "空白字符"
+ 表示前面的匹配项出现一次或多次
* 表示前面的匹配项出现零次或多次
\K 表示从此处开始保留匹配

最后一个 \s 上的 * 允许最后三行文本在没有尾随换行符的情况下结束。当在大量文本上执行此类操作时,重要的是确保替换在整个文本上正常工作,没有不需要的子字符串残留。

虽然我相信您早已忘记了这个正则表达式任务,但重要的是未来的读者能够从中学习到实现所需结果的最佳方法。


感谢您的输入! - William

0

另一种方法是使用插件ConyEdit来完成此操作。使用命令行cc.dl 3.3删除每个组的第三行,每个组有3行。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接