2010-11-18 23 views
40

Uso la expresión (query-replace-regexp "from" "to") regularmente cuando realizo grandes cambios en un archivo de texto.Emacs, eliminando todas las líneas que no coinciden?

Me gustaría una expresión regular, si existe, para eliminar todas las líneas que no coinciden. Por ejemplo, en un archivo RedHat SPEC para construir un RPM, quiero dejar solo en las líneas que comienzan con /^Patch/ (y eliminar todas las líneas que no coinciden). Lo suficientemente fácil con grep -E '^Patch', pero ¿hay alguna manera en Emacs?

me trataron:

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

en vano (negativo-lookahead aparece sin soporte).

¿Alguna idea?

Respuesta

76

Trate M-x mantener líneas^Patch lugar:

(keep-lines REGEXP &optional RSTART REND INTERACTIVE)

Eliminar todas las líneas excepto aquellas coincidencias que contienen, por REGEXP.

También existe el comando opuesto, M-x flush-líneas, que elimina las líneas que coincidan con una expresión regular.

+0

Esto funcionó, ¡gracias! –

4

Si es sólo "parche" que busca, puede identificar las líneas que no coincidan con ^Patch utilizando

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

admito, es bastante feo, sin embargo. =)

+0

Jaja .. me encanta! –

17

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

+0

Esto funcionó, ¡gracias! –

+8

La documentación para 'delete-non-matching-lines' explica que este es un alias para' keep-lines' y 'delete-matching-lines' es un alias para' flush-lines'. –

Cuestiones relacionadas