Normal ifadeler, dosyaları filtrelemek için kullanılan joker karakterlerden nasıl farklıdır?


15

Kullandığımız iken *içinde sıfır veya daha fazla önceki karakterleri belirtmek için grep, kullandığımız *.cbiz birlikte kullanıldığında tüm C dosyaları bulmak için lsbenzeri komuta ls *.c. Birisi *bu iki durumda kullanımının nasıl farklı olduğunu söyleyebilir mi?

Yanıtlar:


30

Kabuk dosya adı globbing ve düzenli ifadeler aynı karakterlerden bazılarını kullanır ve benzer amaçları vardır, ancak haklısınız, uyumlu değiller. Dosya adı globbing çok daha az güçlü bir sistemdir.

Dosya adında globbing:

  • * "sıfır veya daha fazla karakter" anlamına gelir

  • ? "herhangi bir tek karakter" anlamına gelir

Normal ifadelerde, .*"sıfır veya daha fazla karakter" anlamına gelmek ve ."herhangi bir tek karakter" anlamına gelmek zorundasınız . A ?, normal ifadelerde oldukça farklı bir şey anlamına gelir: sıfır veya önceki RE öğesinin bir örneği.

Köşeli parantezler ( []) en azından basit durumlar için bunu yazdığım sistemdeki her iki sistemde de aynı şekilde çalışıyor gibi görünüyor. Buna POSIX karakter sınıfları (ör. [:alpha:]) Gibi şeyler dahildir . Bununla birlikte, birçok farklı sistem türünde çalışmak için komutlarınıza ihtiyacınız varsa, karakter listeleri (örneğin [abeq]) ve belki de karakter aralıkları (örn. [a-c]) Gibi temel şeylerin ötesinde bir şey kullanmamanızı öneririz .

Bu farklılıklar, iki sistemin sadece basit durumlar için doğrudan değiştirilebilir olduğu anlamına gelir. Dosya adlarının normal ifade eşleşmesine ihtiyacınız varsa, bunu başka bir şekilde yapmanız gerekir. find -regexbir seçenektir. ( find -nameBu arada, glob sözdizimini kullanan dikkat edin .)



3
Ek olarak, regex'in çeşitli lezzetleri vardır. Tüm regex'ler aynı şekilde oluşturulmaz! Ve SQL gibi diğer birçok desen eşleştirme sistemleri var gibi yerlerde, '%'araçlar '*'.
Bay Lister

4
Normal ifadenin iki ana çeşidi POSIX ve PCRE'dir (Perl Uyumlu RE). Daha sonra daha az sargılı ve daha fazla özelliğe sahip. Unix araçları ve kabukları genellikle POSIX'i kullanır; yerleşik regexps (kabuk hariç) olan çoğu programlama dili PCRE kullanır. On-line materyal okurken aradaki farka dikkat edin.
goldilocks

11

Orijinal başlıkta ifade edilen soruya cevap:

Normal ifadeler dosya filtrelemek için kullanılan ifadelerden neden farklıdır?

Dosya adı genişletmesi, çoğu işletim sisteminde (joker karakter / joker karakter) zaten var olan normal ifadelerden önce gelir ve ikincisinden çok daha basit ve sezgiseldir.

*.txtSıradan kullanıcılar tarafından kolayca anlaşılabilir olsa da, analog .*\.txt, deneyimli kullanıcılara / programcılara daha fazla hedeflenen bir şeydir, bahsetmiyorum bile ^.*\.txt$...


2
“Neden” kısmının başka bir nedeni: hız. Düzenli ifadeler daha yavaştır: pastebin.com/3iNCgkE3
manatwork

3
*.txteşit değil .*\.txt, (çoğunlukla) eşittir, .*\.txt$çünkü .txten azından hiçbir şey olamaz (en azından makul dosya adı globbing varsayarak ). Belki de ^.*\.txt$kullanıma bağlı olarak biraz. Ne demek istiyorsun?
CVn
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.