Greps "Ungültiges Bereichsende" - Bug oder Feature?

8

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%     
Michal Rus 05.11.2014, 09:58
quelle

1 Antwort

21

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:

%Vor%

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. .

Wie können Sie das lösen?

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.

    
fedorqui 05.11.2014, 10:06
quelle

Tags und Links