Düzenli ifadeler VS Dosya adı globbing


15

Normal ifadelerin yalnızca karakter ve dizgilerle kullanılması gerektiğini biliyorum, ancak bazen bunları dosya adlarında buluyorum. Sorum şu: Normal ifadeler yalnızca karakterlerle mi yoksa dosya adlarıyla mı kullanılıyor?

Yanıtlar:


19

Düzenli ifadeler ve dosya adı globbing çok farklı iki şeydir.

Metinde desen eşleşmesi için komutlarda / işlevlerde normal ifadeler kullanılır. Örneğin, model parametresinde grepveya programlama dillerinde.

Dosya adı globbing, kabuklar tarafından joker karakterler kullanarak dosya ve dizin adlarını eşleştirmek için kullanılır. Globbing kabiliyeti kabuğa bağlıdır. Örneğin Bash, aşağıdaki joker karakterleri destekler:

  • * 0 veya daha fazla karakterle eşleş
  • ? 1 karakteri eşleştir
  • [...] belirtilen kümedeki bir karakterle eşleş

Bu joker karakterler düzenli ifadelere benzeyebilir, gerçekten [...]de globbing ve regex'te aynı anlama sahiptir. Ama *ve ?globbing ve düzenli ifade içinde ortalama farklı şeyler.

Bir yorumda şunları yazdınız:

Peki tercüman farkı * şakacı mı yoksa regex mi? örneğin: grep a*b a*.txt?

Kolay. Bir çeşit.

Her şeyden önce, kabuk, joker karakterleri dosya adlarıyla eşleştirerek yorumlamaya çalışır. "A" ile başlayan ve "b" ile biten dosyalar varsa, kabuk a*beşleşen dosya adlarıyla değiştirilir . Aynı şey geçerli a*.txt. Eşleşen dosya adı yoksa, kabuk argümanları oldukları grepgibi geçirir.

Ancak, ilk parametresi grepbir örüntü olmalıdır. Pratik kullanım örneklerinin% 99,999'unda ilk parametrenin kabuk tarafından yorumlanmasını istemezsiniz. Büyük olasılıkla niyet şuydu:

grep "a*b" a*.txt

Alıntılama a*bsayesinde, kabuk globbing kullanarak yorumlamaz ve bunun yerine doğrudan iletir grep. Buna karşılık, grepbunu düzenli bir ifade olarak (tasarım gereği) yorumlayacaktır.

Özetlemek gerekirse, kabuk komut satırını joker karakterler kullanan kendi globbing dilini izleyerek yorumlar. Komutlar, programlar yazarları tarafından tasarlandıkları şekilde parametrelerini yorumlar.


4

Dosya adı sizin için bir dizeyse, dosya adları için de normal ifadeyi kullanabilirsiniz. Örneğin: normal ifadeyle eşleşen dosya adlarını bulmak istiyorsanız deneyebilirsiniz:

find ./ -regex '.*[abc][xyz].*'

Komut, adında a, b veya c ve ardından x, y veya z olan dosyaları arar. Bu sadece bir örnek. Sonsuz olasılıklar var.


Peki tercüman farkı * şakacı mı yoksa regex mi? örneğin: $ grep a "asteriks" b a "asteriks" .txt
Hamza

2
Kullanıyorsanız find ./ -name 'a*'joker karakter olarak * kullanırsınız. Eğer yazdığınızda find ./ -regex 'a*', bir regex * kullanın. Önemli fark anahtar -nameveya -regex.
kimse
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.