Emacs, удалив все строки, которые не совпадают?
Я использую выражение (query-replace-regexp "from" "to")
регулярно при больших изменениях в текстовом файле.
Я хочу, чтобы регулярное выражение, если оно существует, удаляло все строки, которые не совпадают. Например, в файле SPEC RedHat для создания RPM я хочу оставить только строки, начинающиеся с /^Patch/
в них (и удалить все несоответствующие строки). Достаточно легко с grep -E '^Patch'
, но есть ли способ в Emacs?
Я пробовал:
(query-replace-regexp "^\\(?!Patch\\)[^\r\n]*$" "")
безрезультатно (отрицательный-lookahead появляется неподдерживаемый).
Любые идеи?
Ответы
Ответ 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]*$
Я признаю, что это довольно уродливо. =)