正则表达式:删除包含“help”等内容的行

479

我有一份很长的命令文档。使用Notepad++ 或正则表达式,我想要删除所有包含“help”(包括keyboard_help等)的行。

如何实现?

7个回答

1180

Notepad++ 也可以实现这一功能:

  • 打开搜索菜单,使用快捷键 Ctrl + F,然后打开 Mark 标签页。
  • 勾选 Bookmark line(如果没有 Mark 标签页,请升级到最新版本)。

  • 输入你要搜索的词语并点击 Mark All

    • 所有包含搜索词语的行都会被加上书签。
  • 现在进入菜单 SearchBookmarkRemove Bookmarked lines

  • 完成。


46
太好了!它还有“删除未标记的行”,类似于grep,正是我需要的! - Chloe
如何删除/复制所有书签后面连续的3行? - Joarder Kamal
11
在这里检查“BOOKMARK LINE”非常重要,否则它将无法工作! - Haseeb Mir
3
无法使用,书签行无法删除。 - Dmitrij Holkin
3
不必使用Ctrl + F并点击“标记”选项卡,您可以直接按Ctrl + M - Makesh
显示剩余5条评论

240

在Notepad++中另一种使用正则表达式进行替换的方法如下:

  • Ctrl + h打开查找替换对话框。

  • 查找内容:文本框中包含您的正则表达式:.*help.*\r?\n(其中\r是可选的,以防文件没有Windows行尾)。

  • 替换为:文本框留空。

  • 确保在搜索模式区域中选择了“正则表达式”单选按钮。然后单击全部替换即可!所有包含搜索词help的行都被删除了。

How-To Line Replace in N++


20
比使用标记选项卡更好的答案,因为这可以用于“在文件中查找”。 - Alex
2
请确保使用反斜杠转义特殊字符,例如括号。 - Noumenon
5
请确保取消选中“。匹配换行符”。 - MagTun
1
由于更高的性能,答案更好。对于超过100万行的文件,书签方法已经被推到了极限,即使在现代机器上也是如此。 - Roland Ettinger
这会导致下一行有时会被TAB缩进。为什么? - schanti schul
@schantischul 我不是100%确定,但我能想到的唯一可能是正则表达式可能会贪婪地消耗多行?也许尝试使用.*?而不仅仅是.*来进行非贪婪匹配。 - OozeMeister

21

使用正则表达式进行搜索:

^.*(help).*$

2
删除部分怎么办? - Peter Mortensen
1
@PeterMortensen 找到 \n\n,替换为 ``(空) - Leo
然而在Windows中,可以使用\r\n\r\n并将其替换为空。 - FaranAiki

19

使用 grep 完成的简单任务:

grep -v help filename

> newFileName添加到命令中以将输出重定向到新文件。


更新

为了澄清,正常情况下会在屏幕上打印出行。要将其导入到文件中,可以使用>。因此,在此命令中:

grep -v help filename > newFileName
  1. grep 命令显然调用了 grep 程序。
  2. -v 是一个标志,用于反转输出。默认情况下,grep 打印与给定模式匹配的行。使用此标志,它将打印不匹配该模式的行。
  3. help 是要匹配的模式。
  4. filename 是输入文件的名称。
  5. > 重定向输出到后面的内容。
  6. newFileName 是保存输出结果的新文件名。

正如你可能已经注意到的,你不会删除文件中的任何东西。grep 将读取它,并将根据需要修改并保存到另一个文件中。


@Kevin Duke:唉!这可能意味着你没有安装grep。无论如何,我建议你安装GNU grep,它肯定可以在Windows上工作,并且是一个非常有用的工具。 - sidyll
@sidyll 它知道 grep 是什么,并且输出了一堆内容,可能是因为我没有指定输出文件。 - dukevin
2
@Kevin Duke:正如我之前在答案中所说,输出可以被重定向。标准行为是在屏幕上打印。要进行重定向,您可以使用管道(在这种情况下是 >),最终命令为 grep -v help filename > outputFileName - sidyll
在查找字符序列方面,grep > sed任何一天。 - kwikness

14

你可以使用sed命令来实现:sed '/help/ d' < inputFile > outputFile


4
在Linux/Mac/其他系统中的命令行中执行此操作。如果您在Windows上,则需要安装类似CygWin之类的软件,并使用该软件来执行操作。 - Tikhon Jelvis
谢谢 @TikhonJelvis!最后一个问题,我们可以使用sed 'help/'来删除所有以help开头的行(而不是包含help的所有行)吗? - jeff
3
我认为 sed '/^help/ d' 可以起作用。^ 表示行的开头。 - Tikhon Jelvis
@jeff PowerShell有sedgrep - Ooker
Cygwin可能无法在带有UTF-16文件的Windows上工作。 Cygwin实用程序默认使用UFT-8。其中很少有一些支持UTF-16。请使用babun http://babun.github.io/。它作为cygwin的包装器,但提供了许多开箱即用的功能。 - Sahil Singh

10

如果你在 Windows 操作系统上,可以尝试使用 findstr 命令。不需要使用第三方工具:

findstr /V /L "searchstring" inputfile.txt > outputfile.txt

它也支持正则表达式!只需阅读工具的帮助文档 findstr /?

P.S. 如果您想处理大型,巨大的文件(如400 MB的日志文件),文本编辑器不是非常内存高效,因此,正如有人已经指出的那样,命令行工具是正确的选择。但是在Windows上不存在grep,所以...

我刚在1 GB的日志文件上运行了这个命令,只用了3秒钟。


如果你在使用Windows系统,等等,什么?我以为Notepad++只能在Windows上使用? - FaranAiki
@FaranAiki 或许吧,我不清楚 Notepad++ 是为哪个操作系统设计的。 - Alex from Jitbit

1

你需要分两步完成它。

1. 为具有该模式的行添加书签

CTRL + M键。在“查找内容”文本框中输入模式。然后选择标记为书签行的复选框。接着点击名为 "全部标记" 的按钮。关闭对话框。

2. 删除这些已书签的行

按 ALT + S(earch) + B(ookmark) + R。然后按Enter键。

完成。


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