`Grep fil *` neden başarısız oluyor?


9

echo file|grep fil*Başarısız buldum ama echo abcd|grep abc*başarılı oldum .

Anlamıyorum, biri açıklayabilir mi?


Sistemi ve grep sürümünü ekleyebilir misiniz? Çünkü gnugrep 2.16 (Ubuntu 14.04 LTS altında), herhangi bir hata oluşturmaz (çıkış kodu 0) ve ilk üç harfle eşleşir. Örneğin, echo file|grep fil*birlikte cevaplar file.
Hastur

3
@Hastur Sorun, normal ifadeden önce dosya adı genişlemesinden kaynaklanır. Çalışma dizinim fil tarafından önek içeren bir dosya içeriyor, ancak abc tarafından öneklenmiş bir dosya içermiyor.
tmpbin

Teşekkürler bunu düşünmedim.
Hastur

Yanıtlar:


31

Örneğinizde iki sorun var.

Birincisi, düzenli ifadelerin "herhangi bir karakter dizisi" anlamına gelen bir joker karakter olan glob desenleriyle aynı şekilde çalıştığını varsaymanızdır *. Normal ifadelerde, *bunun yerine "önceki atomun herhangi bir sayısı" fil*anlamına gelir , bu nedenle fbunu isıfır veya daha fazla lkarakter izler . grep fil.*Amaçlanan anlamı elde etmek için söylemelisiniz : ."herhangi bir tek karakter, yani .*" herhangi bir karakter dizisi "anlamına gelir.

Daha az sorun, glob kuralları altında bir şey anlamına gelen, kabuğun bunları yorumlayabileceği anlamına gelen alıntılanmamış özel karakterler kullanmanızdır. Glob modellerle eşleşen yerel dizindeki tüm dosyaları olsaydı fil*ya abc*, bunları genişletecek kabuk , bu nedenle grepbir model değil, amaçlanan RE olarak genişletilmiş dosya adları tanınacak. Eğer komut satırında bu tür karakterleri kullanarak olduğunuzda tek onları alıntı olmalıdır: echo file | grep 'fil.*'.

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.