2012-05-10 14 views
9

Ich habe ein bisschen ein Problem mit Grep, dass ich nicht scheinen kann, herauszufinden. Ich versuche, nach allen Instanzen von Kleinbuchstaben zu suchen, die in doppelte Anführungszeichen (C-Zeichenfolgen) in einer Reihe von Quelldateien eingeschlossen sind. Mit bash und Gnu grep:Grep Muster passenden Kleinbuchstaben Zeichenfolge in Anführungszeichen

grep -e '"[a-z]+"' *.cpp 

keine Treffer gibt mir, während

grep -e '"[a-z]*"' *.cpp 

mich wie "Abc" gibt Spiele, die nicht nur Kleinbuchstaben ist. Was ist der richtige reguläre Ausdruck, um nur "abc" zu finden?

+0

Ihre zweite Regex sieht gut aus. Ich habe es versucht und es passt nicht zu Großbuchstaben. – Misha

+1

@Mike Sie vergessen die länderspezifische Sortierreihenfolge. –

+0

@Don Danke, habe nicht einmal darüber nachgedacht! – Misha

Antwort

8

Sie vergessen Meta-Zeichen.

grep -e '"[a-z]\+"' 

Für den zweiten Teil, der Grund ist es mehr Fall Zeichen ist passend ist wegen Ihrer locale. Wie folgt:

$ echo '"Abc"' | grep -e '"[a-z]\+"' 
"Abc" 
$ export LC_ALL=C 
$ echo '"Abc"' | grep -e '"[a-z]\+"' 
$ 

Um das "ascii-like" Verhalten zu erhalten, müssen Sie Ihr Gebietsschema auf "C", wie in der grep Manpage angegeben:

Innerhalb eines Klammerausdruckes, Ein Bereichsausdruck besteht aus zwei Zeichen, die durch einen Bindestrich getrennt sind. Es entspricht einem beliebigen Zeichen , das zwischen den beiden Zeichen einschließlich der Sortierfolge und des Zeichensatzes des Gebietsschemas sortiert. Zum Beispiel ist im Standard-C-Gebietsschema [a-d] äquivalent zu [abcd]. Viele Locales sortieren Zeichen in Wörterbuchreihenfolge, und in diesen Locales ist [a-d] typischerweise nicht äquivalent zu [abcd]; es könnte beispielsweise äquivalent zu [aBbCcDd] sein. Um die traditionelle Auslegung der Klammerausdrücke zu erhalten, können Sie das C-Gebietsschema verwenden, indem Sie den Umgebungsvariable LC_ALL auf den Wert C. Einstellung

+0

Yup, dumme Schauplätze. Auch warum muss ich dem + entkommen? Ich würde denken, dass, wenn ich ein Literal + wollte, ich es entfliehen würde und dass ein blankes + als Metazeichen betrachtet würde. –

+1

In grundlegenden regulären Ausdrücken verlieren die Metazeichen?, +, {, |, (, Und) ihre spezielle Bedeutung; Verwenden Sie stattdessen die umgekehrten Versionen \ ?, \ +, \ {, \ |, \ (, und \). Um verlängert zu regexen, benutze -E –

+0

-E, danke. Alte Gewohnheiten sind schwer abzulegen. –

1

Maske der +

grep -e '"[a-z]\+"' *.cpp 

oder verwenden egrep:

egrep '"[a-z]+"' *.cpp 

vielleicht hatten Sie -E im Sinn:

grep -E '"[a-z]+"' *.cpp 

Die Klein -e verwendet wird, zum Beispiel, um mehrere Suchmuster anzugeben.

Die phaenomenon von Großbuchstaben könnte Ursprung von Ihrem Standort - die Sie mit verhindern:

LC_ALL=C egrep '"[a-z]+"' *.cpp 
+0

Ich dachte Grep -e war egrep. Ich glaube, ich habe mich geirrt. –

+0

Ja, das dachte ich mir auch, aber da es meine Gewohnheit ist, egrep zu verwenden, habe ich egrep getestet, ohne näher auf die -e-Option zu schauen, und gleich nach dem Erfolg mit egrep merkte ich, dass das -e eine ähnliche Sache machen sollte - ich dachte dasselbe. Aber die richtige Option ist -E, mit Kapital E. Bitte schauen Sie sich in der Manpage an. –

0

Sie wahrscheinlich brauchen, um die Flucht der +: die

grep -e '"[a-z]\+"' *.cpp 
zu entkommen
0

Wenn Sie nicht wollen, zu verwirren über mit Gegenden, dies für mich gearbeitet:

grep -e '"[[:lower:]]\+"' 
Verwandte Themen