2010-11-18 7 views
40

J'utilise régulièrement l'expression (query-replace-regexp "from" "to") lors de modifications importantes dans un fichier texte.Emacs, en supprimant toutes les lignes qui ne correspondent pas?

Je voudrais une expression régulière, si elle existe, pour supprimer toutes les lignes que ne correspondent pas. Par exemple, dans un fichier RedHat SPEC pour construire un RPM, je veux laisser juste les lignes qui commencent par /^Patch/ (et supprimer toutes les lignes qui ne correspondent pas). Assez facile avec grep -E '^Patch' mais y a-t-il un moyen chez Emacs?

J'ai essayé:

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

sans résultat (-négatif apparaît non pris en charge préanalyse).

Des idées?

Répondre

76

Essayez M-x garder les lignes^Patch à la place:

(keep-lines REGEXP &optional RSTART REND INTERACTIVE)

Supprimer toutes les lignes sauf celles contenant des correspondances REGEXP.

Il y a aussi la commande inverse, flush-lignes M-x, ce qui supprime les lignes correspondant à une expression régulière.

+0

Cela a fonctionné, merci! –

4

Si c'est juste « Patch » que vous recherchez, vous pouvez identifier les lignes qui ne correspondent pas ^Patch en utilisant

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

je l'avoue, il est plutôt laid, cependant. =)

+0

Haha .. love it! –

17

utilisation M-x delete-non-matching-lines et M-x delete-matching-lines

+0

Cela a fonctionné, merci! –

+8

La documentation de 'delete-non-matching-lines' explique qu'il s'agit d'un alias pour' keep-lines' et 'delete-matching-lines' est un alias pour' flush-lines'. –