grep “+” operatörü çalışmıyor


31

Bu

ls -l /var/log | awk '{print $9}' | grep "^[a-z]*\.log."

çıktı:

alternatives.log.1
alternatives.log.10.gz
alternatives.log.2.gz
alternatives.log.3.gz
alternatives.log.4.gz
alternatives.log.5.gz
alternatives.log.6.gz
alternatives.log.7.gz
alternatives.log.8.gz
alternatives.log.9.gz
apport.log.1
apport.log.2.gz
apport.log.3.gz

ama bu:

ls -l /var/log | awk '{print $9}' | grep "^[a-z]+\.log."

hiçbir şey çıkarmaz.

Niye ya? Sadece değişti *etmek +. Benzer değil mi Operatör +sadece en az bir eşleşmeye ve *sıfır veya daha fazlasına ihtiyaç duyar .

Yanıtlar:


36

Bunun nedeni grep(herhangi bir argüman olmadan) sadece standart normal ifadelerle çalışmaktır. +genişletilmiş düzenli ifadelerin bir parçasıdır, bu nedenle onu kullanmanız grep -Eveya kullanmanız gerekir egrep:

ls -l /var/log | awk '{print $9}' | grep -E "^[a-z]+\.log."

Ayrıca, genişletilmiş düzenli ifadeler kullanmak istemiyorsanız bunu yapabilirsiniz:

ls -l /var/log | awk '{print $9}' | grep "^[a-z][a-z]*\.log."

Teşekkürler. Şimdi bu geçici çözüm hakkında, ancak neden "+" nın işe yaramadığını merak ediyordum. Şimdi biliyorum. Tekrar teşekkürler.
Marko

11

MiJyns'in cevabını detaylandırmak için + gibi "özel karakterler" standart regex'te de çalışır, ancak onlardan bir ters eğik çizgi ile kaçmanız gerekir. Varsayılan beklentilerin standart ve genişletilmiş regex arasında tersine çevrildiğini söyleyebiliriz:

Standart regex'te, karakterler varsayılan olarak tam anlamıyla eşleşir. Örneğin grep "ab+", + harfleri bir hazır bilgidir +. Regex, örneğin "ab + ab" yi bulur, ancak "abbbb" yi bulamaz. + İşaretinin "özel anlamını" kullanmak için ondan kaçmanız gerekir. Öyleyse grep "ab\+""abbb" bulabilir, ancak "ab + ab" yı artık kullanmayacaktı Çünkü son örnekte +, "bir veya daha fazla", bu durumda "bir veya daha fazla b" nicelendiricisi olarak yorumlanır.

Genişletilmiş regex'te tam tersi bir yoldur. Burada, kelimenin tam anlamıyla ele almak için "özel karakterler" kaçmak gerekir. Yani grep -E "ab+""abbb" bulur, fakat "ab + ab" değildir. Eğer + 'dan kaçarsanız, kelimenin tam anlamıyla eşleşir. Böylece grep -E "ab\+""ab + ab" bulunur, fakat "abbb" değil.


1
Ne kadar eski bir karışıklık ... ;-) sihir ve süpermen gibi vim vardır. Urgh. Geriye dönük uyumluluk için ödeme bedeli ...
Rmano
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.