2009-03-25 21 views
9

Ich habe den folgenden regulären Ausdruck für die Beseitigung Leerzeichen, Tabulatoren und Zeilen: [^ \n\t]Mit Escape-Zeichen in grep

Allerdings möchte ich dies für bestimmte zusätzliche Zeichen erweitern, wie > und <.

Ich versuchte [^ \n\t<>], die gut für jetzt funktioniert, aber ich möchte den Ausdruck, wenn die von einem \ vorangestellt ist nicht übereinstimmen < oder >.

Ich versuchte [^ \n\t[^\\]<[^\\]>], aber das hat nicht funktioniert.

+0

Sie können [...] Zeichenklassen nicht so verschachteln. – smci

Antwort

4

Kann eine der folgenden Sequenzen in Ihrer Eingabe vorkommen?

\\>
\\\>
\\\\>
\blank
\tab
\newline
...

Wenn ja, wie schlagen Sie vor, sie zu behandeln?

Wenn nicht, dann zero-width look-behind assertions wird den Trick tun, vorausgesetzt, dass Ihre Engine für reguläre Ausdrücke es unterstützt. Dies ist der Fall in jedem Motor sein, die Perl-Stil reguläre Ausdrücke (einschließlich Perl, PHP, etc.) unterstützt:

(?<!\\)[ \n\t<>] 

Das wird jede un-escaped Raum, Newline, Reiter oder gewinkelte Klammern entsprechen oben. Mehr allgemein (\s keine Leerzeichen zu bezeichnen verwenden, einschließlich \r):

(?<!\\)\s 

Alternativ kann für eine Null-Breite Blick hinter Behauptung, ohne die Notwendigkeit komplementäre Notation (aber wohl weniger effizient):

(?:[^ \n\t<>]|\\[<>]) 

Sie können auch eine Variation des letzteren verwenden, um die \\>, \\\>, \\\\> usw. Fällen auch bis zu einem gewissen endlichen Anzahl vorhergehender Schrägstriche, wie zu behandeln:

(?:[^ \n\t<>]|(?:^|[^<>])[\\]{1,3,5,7,9}[<>]) 
-1

Vielleicht können Sie egrep verwenden und Ihre Musterzeichenfolge in Anführungszeichen setzen. Dies sollte die Notwendigkeit der Flucht auslöschen.

0

Nach the grep man page:

Ein Klammerausdruck ist eine Liste der Zeichen eingeschlossen durch [und].Es entspricht einem einzelnen Zeichen in dieser Liste; Wenn das erste Zeichen der Liste das Caret^ist, dann entspricht es einem beliebigen Zeichen, das nicht in der Liste enthalten ist.

Das bedeutet, dass Sie keine Zeichenfolge wie \ < oder \> nur einzelne Zeichen zuordnen können.

Sofern Sie nicht eine Version von Grep mit Perl Regex-Unterstützung haben, können Sie Lookarounds wie eines der anderen genannten Poster verwenden. Nicht alle Versionen von Grep haben diese Unterstützung.