Emacs, удаляя все строки, которые не совпадают? - PullRequest
44 голосов
/ 18 ноября 2010

Я регулярно использую выражение (query-replace-regexp "from" "to") при внесении больших изменений в текстовый файл.

Мне бы хотелось, чтобы регулярное выражение, если оно существует, удаляло все строки, которые не совпадение.Например, в файле SPEC RedHat для создания RPM я хочу оставить просто строки, начинающиеся с /^Patch/ в них (и удалить все несоответствующие строки).Достаточно просто с grep -E '^Patch', но есть ли способ в Emacs?

Я пытался:

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

безрезультатно (отрицательный взгляд кажется неподдерживаемым).

Любойидеи?

Ответы [ 3 ]

87 голосов
/ 18 ноября 2010

Попробуйте M-x keep-lines ^ Patch вместо:

(keep-lines REGEXP &optional RSTART REND INTERACTIVE)

Удалить все строки, кроме тех, которые содержат совпадения для REGEXP.

Существует также противоположная команда, M-x flush-lines , которая удаляет строки, соответствующие регулярному выражению.

20 голосов
/ 18 ноября 2010

используйте M-x delete-non-matching-lines и M-x delete-matching-lines

4 голосов
/ 18 ноября 2010

Если вы ищете только «Patch», вы можете определить строки, не соответствующие ^Patch, используя

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

Я признаю, что это довольно некрасиво.=)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...