2010-11-18 92 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