2010-11-18 4 views
40

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

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

Я пробовал:

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

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

Любые идеи?

ответ

76

Попробуйте M-х держать ЛИНИЙ^Patch вместо:

(keep-lines REGEXP &optional RSTART REND INTERACTIVE)

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

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

+0

Это сработало, спасибо! –

4

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

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

Признаюсь, это довольно некрасиво, хотя. =)

+0

Ха-ха .. люблю его! –

17

использование M-x delete-non-matching-lines и M-x delete-matching-lines

+0

Это сработало, спасибо! –

+8

Документация для 'delete-non-matching-lines' объясняет, что это псевдоним для' keep-lines' и 'delete-matching-lines' является псевдонимом для' flush-lines'. –

Смежные вопросы