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

PP.*_*PP. 45 regex emacs

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

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

我试过了:

(query-replace-regexp "^\\(?!Patch\\)[^\r\n]*$" "")
Run Code Online (Sandbox Code Playgroud)

无济于事(负面预测似乎不受支持).

有任何想法吗?

Gar*_*ees 88

尝试M-x keep-lines ^Patch改为:

(keep-lines REGEXP &optional RSTART REND INTERACTIVE)

删除包含REGEXP匹配项的所有行.

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


小智 21

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

  • `delete-non-matching-lines`的文档解释了这是`keep-lines`的别名,`delete-matching-lines`是`flush-lines`的别名. (11认同)

Jen*_*ens 5

如果它只是您正在寻找的“补丁”,则可以使用以下命令识别不匹配^Patch的行

^([^P]|P[^a]|Pa[^t]|Pat[^c]|Patc[^h])[^\r\n]*$
Run Code Online (Sandbox Code Playgroud)

我承认,虽然它相当丑陋。=)