2010-11-18 63 views
40

在对文本文件进行大的修改时,我经常使用(query-replace-regexp "from" "to")表达式。Emacs,删除所有不匹配的行?

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

我尝试:

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

无济于事(负先行出现不支持)。

任何想法?

回答

76

尝试M-X保持线^补丁代替:

(keep-lines REGEXP &optional RSTART REND INTERACTIVE)

删除所有线除了REGEXP那些含有匹配。

还有相反的命令,M-X冲洗线,它去除了匹配正则表达式线。

+0

这工作,谢谢! – 2010-11-19 15:46:47

4

如果它只是“补丁”你正在寻找的,你可以通过使用

^([^P]|P[^a]|Pa[^t]|Pat[^c]|Patc[^h])[^\r\n]*$ 

我承认识别不匹配^Patch线,这是相当难看,但。 =)

+0

哈哈..喜欢它! – 2010-11-19 15:46:13

17

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

+0

这工作,谢谢你! – 2010-11-19 15:47:08

+8

'delete-non-matching-lines'的文档解释了这是'keep-lines'的别名,'delete-matching-lines'是'flush-lines'的别名。 – 2010-11-19 15:48:12