2012-05-10 24 views
9

Mam problem z grep, którego nie mogę wymyślić. Próbuję wyszukać wszystkie wystąpienia małych liter zamknięte w podwójnych cudzysłowach (ciągi C) w zestawie plików źródłowych. Korzystanie bash i GNU grep:Wzór pasujący do wzorca Grep zamknięty w podwójnych cudzysłowach

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

daje mi żadnych mecze, natomiast

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

daje mi pasuje jak "ABC", która jest nie tylko małe litery. Jakie jest prawidłowe wyrażenie regularne pasujące tylko do "abc"?

+0

Twój drugi wyrażenie wygląda dobrze. Próbowałem go i nie pasuje do wielkich liter. – Misha

+1

@Mike, zapominamy o kolejności sortowania określonej lokalizacji. –

+0

@Don Dzięki, nawet o tym nie pomyślałem! – Misha

Odpowiedz

8

Zapominasz się uciec meta znaków.

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

Dla drugiej części, powodem jest dopasowanie wielu liter z powodu swojej lokalizacji. W następujący sposób:

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

Aby uzyskać "ASCII-like" zachowanie, trzeba ustawić locale "C", jak podano na stronie grep Man:

w wyrażeniu wspornika, wyrażenie zakresu składa się z dwóch znaków rozdzielonych łącznikiem. Pasuje do dowolnego pojedynczego znaku , który sortuje między dwoma znakami, włącznie, przy użyciu sekwencji zestawiania ustawień narodowych i zestawu znaków. Na przykład w domyślnym locale C z domeny , [a-d] jest równoważne [abcd]. Wiele loci sortuje znaki w kolejności słownikowej, a w tych lokalizacjach [a-d] jest zwykle nierównomierne [abcd]; może to być na przykład [aBbCcDd]. Aby uzyskać tradycyjną interpretację wyrażeń wspornika można użyć locale C przez ustawienie zmiennej środowiskowej LC_ALL do wartości C

+0

Yup, głupie ustawienia regionalne. Ponadto, dlaczego muszę uciec +? Pomyślałbym, że gdybym chciał dosłownie + uciekłbym i że gołe + byłoby metaznakiem. –

+1

W podstawowych wyrażeniach regularnych meta-znaki?, +, {, |, (I) tracą swoje specjalne znaczenie; zamiast tego użyj odwróconych wersji \ ?, \ +, \ {, \ |, \ (i \). Aby uzyskać rozszerzone wyrażenie, użyj -E –

+0

-E, dziękuję. Stare zwyczaje umierają ciężko. –

1

maskować +

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

lub użyć egrep:

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

może miałeś -E pamiętać:

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

Mała litera -e jest używany, na przykład, określić wiele wzorców wyszukiwania.

phaenomenon z wielkimi literami może pochodzenie od danej lokalizacji - co można zapobiec z:

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

Myślałem, że grep -e był egrep. Chyba się pomyliłem. –

+0

Tak, też tak myślałem, ale ponieważ moim nawykiem jest używanie egrep, przetestowałem egrep nie patrząc bliżej opcji -e, a zaraz po osiągnięciu przez egrep zdałem sobie sprawę, że -e powinno zrobić coś podobnego - ja myślałem tak samo. Ale właściwą opcją jest -E, ze stolicą E. Proszę szukać-siebie na stronie podręcznika. –

0

Prawdopodobnie trzeba uciec +:

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

Jeśli nie chcą zadzierać z o lokalizacjach, to pracował dla mnie:

grep -e '"[[:lower:]]\+"' 
Powiązane problemy