2010-11-18 10 views
40

Uso regolarmente l'espressione (query-replace-regexp "from" "to") quando si apportano grandi modifiche in un file di testo.Emacs, rimuovendo tutte le linee che non corrispondono?

Vorrei un'espressione regolare, se ne esiste una, per rimuovere tutte le righe che non corrispondono a . Ad esempio, in un file SPEC RedHat per la creazione di un RPM voglio lasciare solo le righe che iniziano con /^Patch/ in esse (ed eliminare tutte le righe non corrispondenti). Abbastanza facile con grep -E '^Patch' ma c'è un modo in Emacs?

ho provato:

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

senza alcun risultato (negativo-lookahead appare non supportata).

Qualche idea?

risposta

76

Prova M-x keep-linee^Patch invece:

(keep-lines REGEXP &optional RSTART REND INTERACTIVE)

cancellare tutte le linee ad eccezione di quelli che contengono le partite per REGEXP.

C'è anche il comando opposto, M-x flush-linee, che rimuove le linee corrispondenti a una regexp.

+0

Questo ha funzionato, grazie! –

4

Se è solo "Patch" che si sta cercando, è possibile identificare le linee che non corrispondono ^Patch utilizzando

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

lo ammetto, è piuttosto brutto, però. =)

+0

Haha .. love it! –

17

uso M-x delete-non-matching-lines e M-x delete-matching-lines

+0

Questo ha funzionato, grazie! –

+8

La documentazione per 'delete-non-matching-lines' spiega che questo è un alias per' keep-lines' e 'delete-matching-lines' è un alias per' flush-lines'. –

Problemi correlati