Ich habe diese drei Dateien:
%Vor%Und jetzt, ist das folgende ein Bug oder eine Regexp-Funktion, die ich nicht kenne?
%Vor%Ich benutze:
%Vor% Dies liegt daran, dass Sie den Bindestrich innerhalb anderer Zeichen verwenden, sodass grep
dies als Bereich versteht, der zufällig ungültig ist.
Du machst im Grunde
%Vor% Dies wird von grep
interpretiert, wenn Sie einen Bereich von Zeichen angeben, die geprüft werden sollen, wie zum Beispiel grep "[a-z]" file
. Aber der Bereich von \
bis '
ist ungültig, daher der Fehler.
Und warum arbeitet der andere? Du fragst dich vielleicht selbst. Denn was du tust ist:
%Vor% In diesem Fall suchen Sie entweder nach dem Zeichen '
, \
oder -
in der Datei.
Siehe ein anderes Beispiel, in dem ich die Zeichen a
, -
oder 3
in einer gegebenen Zeichenfolge finden möchte:
Das zugrunde liegende Problem ist also, dass Sie einen Ausdruck some character
+ -
+ another character
innerhalb eines []
Blocks verwenden und versuchen, als Zeichenbereich zwischen some character
und another character
gelesen zu werden. .
Wenn Sie das Zeichen -
unter anderen anpassen möchten, fügen Sie es einfach in die Kanten des Ausdrucks ein: als erstes oder letztes Element.
Von man grep
:
Zeichenklassen und Klammerausdrücke
Ein Klammerausdruck ist eine Liste von Zeichen, die von [und] eingeschlossen sind. Es passt auf jedes einzelne Zeichen in dieser Liste; wenn das erste Zeichen der Liste ist die Caret ^ dann passt es auf ein beliebiges Zeichen nicht in Die Liste. Zum Beispiel stimmt der reguläre Ausdruck [0123456789] überein jede einzelne Ziffer.
Innerhalb eines Klammerausdrucks besteht ein Bereichsausdruck aus zwei Zeichen getrennt durch einen Bindestrich . Es passt zu jedem einzelnen Zeichen Das sortiert zwischen den beiden Zeichen, einschließlich, die Locale verwenden Sortierfolge und Zeichensatz. Zum Beispiel im Standard C Gebietsschema, [a-d] entspricht [abcd]. Viele Länder sortieren Zeichen in Wörterbuchreihenfolge, und in diesen Lokalen ist typischerweise [a-d] nicht äquivalent zu [abcd]; es könnte äquivalent zu [aBbCcDd] sein, z Beispiel. Um die traditionelle Interpretation der Klammer zu erhalten Ausdrücke können Sie das C-Gebietsschema verwenden, indem Sie LC_ALL festlegen Umgebungsvariable auf den Wert C.
Schließlich sind bestimmte benannte Klassen von Zeichen innerhalb vordefiniert Klammer Ausdrücke wie folgt. Ihre Namen sind selbsterklärend, und sie sind [: alnum:], [: alpha:], [: cntrl:], [: digit:], [: Graph:], [: Senken:], [: Drucken:], [: Punct:], [: Leerzeichen:], [: Oben:], und [: xdigit:]. Zum Beispiel bedeutet [[: alnum:]] die Zeichenklasse von Zahlen und Buchstaben im aktuellen Gebietsschema. Im C-Gebietsschema und ASCII Zeichensatzcodierung, dies ist das Gleiche wie [0-9A-Za-z]. (Hinweis dass die Klammern in diesen Klassennamen Teil des Symbolischen sind Namen, und müssen zusätzlich zu den Klammern enthalten sein, die den Klammerausdruck.) Die meisten Metazeichen verlieren ihre besondere Bedeutung Innenklammerausdrücke. Um ein Literal einzuschließen] plazieren Sie es zuerst in der Liste. Um ein Literal einzuschließen, plazieren Sie es ebenfalls irgendwo anders als zuerst. Schließlich, um ein Literal aufzunehmen - platzieren Sie es zuletzt.