2011-07-23 5 views
7

Bazı günlerde grepping yapıyordum ve aniden, görünüşte önemsiz bir şeyin işe yaramadığını keşfettim:Grep [A-Z] yerelden bağımsız nasıl yapılır?

$ echo T | grep [A-Z] 

Eşleşme yok.

T nasıl A-Z aralığında değil?

Normal ifadeyi biraz değiştirdim:

$ echo T | grep [A-Y] 

Bir maç!

Whoa! A-Y içinde T nasıldır, fakat A-Z içinde değil midir?

Görünüşe göre bu benim ortamın Y'nin alfabenin sonunda olduğu fakat Z'nin ortada bir yerde olduğu Estonya yerel ayarına ayarlanmasıdır: ABCDEFGHIJKLMNOPQRSŠZŽTUVWÕÄÖÜXY

$ echo $LANG 
et_EE.UTF-8 

Bu her şeyden önce ben mi. Estonya edebiyatı değil, bilgisayar kodlarını grepür ettiğim zamanın% 99'u. Her zaman yanlış şekilde grep kullanıyor muyum? Geçmişte bunun yüzünden ne gibi hatalar yaptım?

Birkaç şeyi denedikten sonra şu çözüme ulaştım:

$ echo T | LANG=C grep [A-Z] 

Bu grep yerel ayarını bağımsız yapmak için önerilen yol mu?

Daha da fazlası ...

$ alias grep="LANG=C grep" 

PS gibi bir takma ad tanımlamak güvenli olur muydu? Ayrıca \w locale gibi karakter aralığı ilk sırada yer alırken merak ediyorum da \w yerel ayardan etkilenmez gibi görünüyor (manuel \w[[:alnum:]]'in karşılığı olsa da - ancak ikincisi \w iken değil).

+0

sadece kabuk olduğunu genişleyen olmadığından emin olmak için, bir kez daha tüm çalışıyorum, ama ifadenizi 'grep '[A-Z]'' teklifinizi veriniz. – Mat

+0

Tam olarak tırnak içi ve tırnaksız olarak aynı şekilde çalışır. –

+0

Sadece A'dan Z'ye adlı bir dosyanız olmadığı için aynı şekilde çalışır. Kabuk [A-Z] 'yi genişletmeye çalıştı, hiçbir şey bulamadı ve tek başına bıraktı. Desenleri her zaman grep'e geçirmek için teklifleri kullanın. – Gilbert

cevap

5

POSIX düzenli ifadeler, bir dizi var. Detaylar için man sayfasına bakınız. [] S olarak

 grep '[[:upper:]]'

Eğer dış [] yanı sıra, görünüşe bakılmaksızın ne kadar tuhaf ihtiyaç Model adının parçasıdır. Bunların çıkışıyla

: w vb kodları klasik \, C yereli kesinlikle kalır. Böylece, desen seçiminiz grep'in geçerli yerel ayarı kullanıp kullanmadığını belirler.

[A-Z] yerel izlemelidir, ancak sistem şunlara ait farklı bir değere LC_ALL ayarlar, özellikle LC_ALL ziyade LANG daha ayarlamak gerekebilir.

+0

Demek ki [A-Z] kesinlikle C bölgesinde mi kalıyor? Ama bütün sorum C locale'de olmama hakkındaydı. –

+0

LANG yerine LC_ALL ortam değişkenini ayarlamayı deneyin. – Gilbert

+0

LC_ALL, grep'in ilk kontrolü yaptığı için muhtemelen LANG'den daha iyi bir değişken. Ama şu an benim için bir fark yaratmıyor. –