繁体   English   中英

emacs:反向搜索

[英]emacs: inverse search

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

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”的所有行。

两个想法:

  1. Mx keep-lines <RET> REGEXP <RET>

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

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

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

你可以使用hide-lines: http//www.emacswiki.org/emacs/hide-lines.el

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

现在您可以使用例如Cs进行搜索...

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

(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”。

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

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

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

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

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

您还可以使用grep搜索,指定您想要的行匹配。

您也可以使用icicle-occur搜索,使用C icicle-occur 删除与您键入的内容相匹配的行。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM