emacs:反向搜索

时间:2010-04-14 19:43:05

标签: emacs

有没有办法进行反向搜索? 我有一个非常大的日志文件,其中一个特定的模式填满了几十页

20100414 alpha beta
20100414 alpha beta
<few dozen pages>
20100414 alpha beta
20100414 gamma delta
20100414 gamma delta
<few dozen pages>
20100414 gamma delta

问题是,我不知道“alpha beta”之后会有什么文字。它可能是“伽玛三角洲”或其他东西。所以我想跳过包含“alpha beta”的所有行。

6 个答案:

答案 0 :(得分:6)

两个想法:

  1. M-x keep-lines <RET> REGEXP <RET>

    将删除与正则表达式不匹配的所有行

  2. M-x grep <RET> grep -nH -e "<REGEXP>" -v <FILE>

    会在NOT中找到包含正则表达式的所有行。

答案 1 :(得分:3)

您可以使用隐藏线:http://www.emacswiki.org/emacs/hide-lines.el

然后M-x hide-lines RET alpha beta RET将隐藏包含“alpha beta”的所有行。

现在您可以使用例如C-s ...

答案 2 :(得分:2)

一般情况下,您不能进行反向搜索,但对于您的特定情况,您可以使用一个简单的函数:

(defun my-skip-lines-matching-regexp (regexp)
  "Skip lines matching a regexp."
  (interactive "sSkip lines matching regexp: ")
  (beginning-of-line)
  (while (and (not (eobp)) (looking-at regexp))
    (forward-line 1)))

然后为正则表达式输入“。+ alpha beta”。

答案 3 :(得分:1)

我通常使用正则表达式搜索来解决这个问题

C-u C-r ^20100414 [^a]

搜索下一行“20100414”,并且大部分时间都会执行此操作。它会找到“伽玛三角洲”线,但显然会错过一条看起来像“20100414 allegro”的线。

还有命令 M-x flush-lines RE ,它删除了与正则表达式RE匹配的所有行。这确实会修改缓冲区。

答案 4 :(得分:0)

您还可以使用grep进行搜索,指定您希望的行匹配。

您还可以使用<{1}}进行搜索,使用 C-~ 删除与您键入的内容相匹配的行。

http://www.emacswiki.org/emacs/Icicles_-_Search_Commands%2c_Overview

答案 5 :(得分:0)

经常被证明有用的启发式方法是跳转到文件的末尾,然后向后搜索要跳过的文本。这种方法的成功显然取决于文件的内容,并且当有问题的重复文本以单个块发生时效果最佳。