有没有办法进行反向搜索? 我有一个非常大的日志文件,其中一个特定的模式填满了几十页
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”的所有行。
答案 0 :(得分:6)
两个想法:
M-x keep-lines <RET> REGEXP <RET>
将删除与正则表达式不匹配的所有行
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)
经常被证明有用的启发式方法是跳转到文件的末尾,然后向后搜索要跳过的文本。这种方法的成功显然取决于文件的内容,并且当有问题的重复文本以单个块发生时效果最佳。