Подтвердить что ты не робот

Emacs, удалив все строки, которые не совпадают?

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

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

Я пробовал:

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

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

Любые идеи?

4b9b3361

Ответ 1

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

(keep-lines REGEXP &optional RSTART REND INTERACTIVE)

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

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

Ответ 2

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

Ответ 3

Если это просто "исправление", которое вы ищете, вы можете идентифицировать строки, не соответствующие ^Patch, используя

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

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