2012-05-10 2 views
9

Ben grep ile bir sorun biraz anlamaya çalışıyorum görünmüyor. Bir dizi kaynak dosyada çift tırnak (C dizgisi) içine alınmış küçük harfli kelimelerin tüm örneklerini aramaya çalışıyorum.Çift tırnak içine alınmış küçük harf dize eşleştirme deseni

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

bana sadece küçük harf değil "Abc" gibi eşleşmeleri verir iken,

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

beni hiç eşleşmeleri verir: Bash ve gnu grep kullanma. Sadece "abc" ile eşleşecek düzgün düzenli ifade nedir?

+0

İkinci normal ifadeniz iyi görünüyor. Denedim ve büyük harf karakterleriyle uyuşmuyor. – Misha

+1

@Mike Yerel ayara özgü sıralama sırasını unutuyorsunuz. –

+0

@Don Teşekkürler, bunun hakkında düşünmemiştim bile! – Misha

cevap

8

:

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

Yup, aptal yerliler. Ayrıca, neden kaçmak zorundayım? Ben bir literal + istediysem, onu kaçardım ve bu metakaracter olarak düşünülecektir. –

+1

Temel normal ifadelerde?, +, {, |, (, Ve) meta-karakterleri özel anlamlarını kaybeder; bunun yerine, ters eğimli sürümleri \ ?, \ +, \ {, \ |, \ (, ve \) kullanın. Uzatılmış regexen almak için -E –

+0

-E kullanın. Eski alışkanlıklar kolay bırakılmıyor. –

1

Maske +

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

veya egrep kullanın:

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

belki aklında -E vardı:

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

küçük -e kullanılır, örneğin, çoklu arama kalıpları belirtmek için

sizin yerel ayarlarından kökenli olabilir büyük harf phaenomenon - Sizinle önleyebilirsiniz: Kaçmak için unutuyorsun

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

grep -e'nin egrep olduğunu düşünmüştüm. Sanırım yanılmışım. –

+0

Evet, ben de öyle düşündüm, ama benim alışkanlığım egrep kullanmak olduğundan, bene'yi -e seçeneğine daha yakından bakmadan test ettim ve hemen egrep ile başarılı olduktan sonra, farkettim ki, -e benzer bir şey yapmalıyım - I aynı düşündüm. Ama doğru seçenek, -E, başkent E ile. Lütfen, kendinizi manpage'de arayın. –

0

Muhtemelen + kaçmak gerekir meta karakterler. İkinci bölüm için, çok harfli karakterlerle eşleşmesinin nedeni yerel ayarınızdır. aşağıdaki gibi:

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

"ascii benzeri" davranışı elde etmek için, yerel ayarlamanız gerekir "C", grep adam sayfasında belirtildiği gibi: parantez ifadelerinde içinde

, aralık ifadesi, tire ile ayrılmış iki karakterden oluşur. Bu, iki karakter arasında yer alan, yerele ait harmanlama sırasını ve karakter kümesini kullanan herhangi bir tek karakterle eşleşir. Örneğin, varsayılan C yerel ayarında, [a-d] [abcd] öğesine eşdeğerdir. Birçok yerel, sözlük sırasına göre karakterleri sıralar ve bu yerellerde [a-d], genellikle [abcd] değerine eşit olmayan ; Örneğin, [aBbCcDd] öğesine eşdeğer olabilir. Eğer yerel ayarlar hakkında karışıklık istemiyorsanız braket ifadelerin geleneksel yorumunu elde etmek için, bu benim için çalıştı, değer C

0

için LC_ALL ortam değişkenini ayarlayarak C yerel kullanabilirsiniz:

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