[英]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”的所有行。
两个想法:
Mx keep-lines <RET> REGEXP <RET>
将删除所有与正则表达式不匹配的行
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.