Emacs,删除所有不匹配的行?

时间:2010-11-18 12:54:41

标签: regex emacs

在文本文件中进行大量更改时,我会定期使用(query-replace-regexp "from" "to")表达式。

我想要一个正则表达式(如果存在),用于删除匹配的所有行。例如,在用于构建RPM的RedHat SPEC文件中,我想让/^Patch/开头的行(并删除所有不匹配的行)。使用grep -E '^Patch'很容易,但在Emacs中是否有办法?

我试过了:

(query-replace-regexp "^\\(?!Patch\\)[^\r\n]*$" "")

无效(负面预测似乎不受支持)。

有什么想法吗?

3 个答案:

答案 0 :(得分:87)

尝试 M-x keep-lines ^ Patch

  

(keep-lines REGEXP &optional RSTART REND INTERACTIVE)

     

删除除REGEXP匹配项以外的所有行。

还有相反的命令, M-x flush-lines ,它删除与正则表达式匹配的行。

答案 1 :(得分:20)

使用M-x delete-non-matching-linesM-x delete-matching-lines

答案 2 :(得分:4)

如果您只是寻找“补丁”,则可以使用

识别与^Patch不匹配的行
^([^P]|P[^a]|Pa[^t]|Pat[^c]|Patc[^h])[^\r\n]*$

我承认,这是相当丑陋的。 =)