2010-11-18 21 views
40

Ich verwende den Ausdruck (query-replace-regexp "from" "to") regelmäßig, wenn große Änderungen in einer Textdatei vorgenommen werden.Emacs, alle Zeilen entfernen, die nicht übereinstimmen?

Ich möchte einen regulären Ausdruck, wenn einer existiert, zum Entfernen aller Zeilen, die nicht übereinstimmen übereinstimmen. In einer RedHat SPEC-Datei zum Erstellen eines RPM möchte ich zum Beispiel nur die Zeilen, die mit /^Patch/ in ihnen beginnen (und alle nicht übereinstimmenden Zeilen löschen). Einfach genug mit grep -E '^Patch' aber gibt es einen Weg in Emacs?

Ich habe versucht:

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

ohne Erfolg (negativer-Look-Ahead erscheint nicht unterstützt).

Irgendwelche Ideen?

Antwort

76

Versuchen M-x Keep-Linien^Patch- statt:

(keep-lines REGEXP &optional RSTART REND INTERACTIVE)

alle Zeilen mit Ausnahme derjenigen enthält Treffer für REGEXP Löschen.

Es besteht auch die entgegengesetzte Befehl M-x flush-Linien, die Linien eine passende regexp entfernt.

+0

Das hat funktioniert, danke! –

4

Wenn es nur „Patch“ Sie suchen, können Sie Linien identifizieren nicht ^Patch Anpassung von

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

mit Ich gebe zu, es ist ziemlich hässlich, aber. =)

+0

Haha .. love it! –

17

Verwendung M-x delete-non-matching-lines und M-x delete-matching-lines

+0

Das hat funktioniert, danke! –

+8

Die Dokumentation für 'delete-non-matching-lines' erklärt, dass dies ein Alias ​​für 'keep-lines' und' delete-matching-lines' ist ein Alias ​​für' flush-lines'. –

Verwandte Themen