Yanıtlar:
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 -regex
bir seçenektir. ( find -name
Bu arada, glob sözdizimini kullanan dikkat edin .)
'%'
araçlar '*'
.
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.
*.txt
Sı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$
...
*.txt
eşit değil .*\.txt
, (çoğunlukla) eşittir, .*\.txt$
çünkü .txt
en 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?