Emacs:如何删除以特定文本开头的行

7

如何查找并删除以文本 in 开头的行?

我使用命令 C-M-s ^in 查找所有以 in 开头的行,但之后我不知道该怎么做。

2个回答

11

M-x flush-lines RET ^in RET

C-h f flush-lines 告诉您:

flush-lines 是一个交互式的编译过的Lisp函数,在replace.el中。

它绑定在menu-bar edit flush-lines上。

(flush-lines REGEXP &optional RSTART REND INTERACTIVE)

删除包含与REGEXP匹配的内容的行。

当从Lisp中调用时(通常也是交互式调用时,参见下文),适用于点之后的缓冲区部分。 当且仅当该行包含从点之后开始的正则表达式匹配项时,才会删除。

如果REGEXP 包含大写字符(除了那些前面有反斜杠\的字符)且search-upper-case为非nil,则匹配区分大小写。

第二个和第三个参数RSTARTREND指定要操作的区域。 如果某行仅包含完全包含在此区域中的匹配项,则删除该行的一部分。

以交互方式,在瞬态标记模式下,当标记处于活动状态时,对区域的内容进行操作。 否则,从点到缓冲区(可访问部分)的末尾进行操作。 当从Lisp调用此函数时,可以通过传递非nil的INTERACTIVE参数来假装它是交互式调用。

如果匹配跨越多行,则删除所有其所在的行。 在查找下一个匹配项之前删除它们。 因此,在同一行上开始的匹配与另一个匹配结束的位置相同的匹配将被忽略。


1
而且,对于那些不知道的人来说,“keep-lines”命令可以与“flush-lines”互补。它们都非常有用。 - phils
3
@phils: 是的。也许记住它们,或稍后通过它们的别名“delete-matching-lines”和“delete-non-matching-lines”重新发现它们会有所帮助。 - Drew
有没有办法交互式地从整个缓冲区中删除匹配的行,而不会丢失您当前的位置? - NetMage
@NetMage: 使用 C-SPC 在光标处设置一个标记。然后使用 M-< 前往 bob。然后清除缓存。最后使用 C-u C-SPC 返回到原来的位置。 - Drew
真让人烦恼 :) 惊讶所有的点/区域命令都不带参数来处理整个缓冲区。 - NetMage
@NetMage: 编写一个符合您要求的命令很简单。并且,由于您要求“交互式”执行它,即使没有命令,您也可以使用M-:(flush-lines REGEXP nil (buffer-size) t)来实现,其中REGEXP是您要匹配的正则表达式。 - Drew

2

运行query-replace-regexp命令并将"in.*"替换为空字符串是可行的。但是请不要在提示框中输入" to"。


清除行比较好 - carlos
它会给出一个空行。但是如果我想要删除整行而不留下空行呢? - vineeshvs
1
请使用 flush-lines 命令,并在提示后输入 ^in.* 正则表达式。 - carlos

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