`A [bc] d` (parantez) ile a {b, c} d` (parantez) arasındaki fark nedir?


28

Arasındaki fark nedir a[bc]dve a{b,c}d? İnsanlar a{b,c}dzaten varken neden kullanıyor a[bc]d?


Sana kullanmanı kim söyledi command a[bc]d?
Jesse_b,

3
Biri onu doğru anlarsa kesinlikle kullanması gerekir.
Weijun Zhou

7
Sanırım ikisi arasındaki karışıklığın nasıl olduğunu anlamıyorum.
Jesse_b,

Son zamanlarda olmasa da, bu konuda Linux ile daha az aşina olan bir iş arkadaşı tarafından açıkça sorulmuştu.
Weijun Zhou

@Jesse_b Onları yalnızca dosyalardaki işlemlerle denerseniz lsve yalnızca tek karakterleri denerseniz, aynı şekilde çalışıyor gibi görünürler.
Nacht - Monica Hazretleri

Yanıtlar:


43

İkisi oldukça farklı.

a[bc]da, dosya kalıp (dışındaki kabuklarda fish). İki dosya adına genişleyecektir abdve acdeğer bunlar mevcut dizindeki mevcut dosyaların isimleriyse.

  • [...]Parçası belirtilen (veya aralıklar dahil bu öğeleri harmanlama) olanlar arasından, tek bir karakter ile eşleşen bir parantez içi ifadesidir. Deseni eşleştirmek için a[bc]d, dizeler arasındaki ave dbir dosya adındaki karakterin a bveya a olması gerekir c.

  • Varsa abd, ancak acdyoksa, o zaman sadece genişler abdve tam tersi olur.

  • Ne olursa abd, ne acdvar, kabuk ve seçeneklere bağlı olarak bir hataya neden (orijinal Unix olur sh, (t)csh, zsh, fish, bash -O failglob) ve muhtemelen kabuk çıkmak, ya da (Bourne benzeri ve desen unexpanded¹ bırakın rcbenzeri kabukları) veya genişletmek hiçbir şey ( bash/zsh/yash -o nullglob, bazı eski sürümleri fish, özgün Unix shve (t)cshaynı komuta diğer eşleştirme Neználkovo varsa).

a{b,c}dbir destek genişlemesidir (bunları destekleyen kabuklarda). İki genişleyecek dizeleri abd ve acd.

  • {...}(Bazıları kabuk, bu da örneğin, bir dizi olabilir, bu örnekte bir parçası şeritlerinin virgülle ayrılmış dizi a..kya da 20..25benzeri ya da daha gelişmiş olanlar 00..20..2ya da 0..20..2%02d), ve genleşme kuşatan bu şeritlerinin her biri birleştirilerek hesaplanır dizeleri ave d. Bu dizgiler tek bir karakterden daha uzun olabilir ve ayrıca kendiliğinden genişleme de olabilir.

  • Genişleme, bu dizelerin mevcut dosya adlarına karşılık gelip gelmediğine bakılmaksızın gerçekleşir.

Dizeler oluşturuyorsanız, küme ayracı genişletme kullanın. Dosya adlarını eşleştiriyorsanız, bir dosya adı deseni kullanın.


Particular Bu özel durumda, a[bc]dmevcut bir dosyanın adı olabilir, bu nedenle rm -f ./*.[ch]bu kabuklarda rm -f ./*.{c,h}olduğu gibi kullanımı potansiyel olarak tehlikelidir ve daha az sorunludur.


“Eğer abd varsa, ama acd yoksa, o zaman sadece abd'ye genişler” diye açıkladığınız için teşekkür ederiz. Sanırım cevabımda eksik olan bu.
Weijun Zhou

9
Bir diğer önemli fark içinde olmasıdır a{b,c}d, bve cparçalar tek harfleri olması gerekmez; örn ex{ten,ci}sion. Bu harflerden ex[tenci]sionyalnızca biriyle eşleşirken veya eşleşirse .
alexis,

7

a[bc]dbir desen eşleştirme ve POSIX standart bir parçasıdır. POSIX’de bu, “desen dizgesi ifadesi” olarak tanıtılır. Kılavuzun 2.13 bölümünde belgelenmiştir.

Alıntı yapılmadığında ve bir parantez ifadesinin dışında kaldığında, aşağıdaki üç karakter, modellerin tanımlanmasında özel bir anlama sahip olacaktır:

    ?
      Soru işareti, herhangi bir karakterle eşleşecek bir kalıptır.
    *
      Yıldız işareti, Birden Çok Karakter Eşleştirme Deseninde açıklandığı gibi birden çok karakterle eşleşecek bir modeldir.
    [
      Açık braket, bir desen braketi ifadesi sunmalıdır.

Kısım 2.13.3 ayrıca, dosya adının genişletilmesi için kullanıldığında olağan regex'ler için beklenenden farklı davranacağından da bahseder.

Şimdiye kadar Tek Bir Karakter Eşleştirme Desenleri ve Birden Çok Karakter Eşleştirme Desenleri bölümünde açıklanan kurallar, dosya adı genişletme için kalıp eşleştirme notasyonu kullanıldığında uygulanan aşağıdaki kurallara göre nitelendirilir:

Bir yol adındaki eğik çizgi karakteri, desende bir veya daha fazla eğik çizgi kullanılarak açıkça eşleştirilir; ne yıldız veya soru işareti özel karakterleriyle ne de bir parantez ifadesiyle eşleştirilmemelidir. Desendeki eğik çizgiler, parantez ifadelerinden önce tanımlanmalıdır; bu nedenle, bir eğik çizgi, dosya adı genişletme için kullanılan desen braketi ifadesine dahil edilemez. Karşılık gelen bir kapanma köşeli parantez bulunmadan önce çıkıntı yapılmayan bir açık köşeli parantez karakterinin ardından bir eğik çizgi karakteri bulunursa, açık parantez sıradan bir karakter olarak ele alınmalıdır. Örneğin, desen veya "a[b/c]d"gibi patnames ile eşleşmiyor . Sadece kelimenin tam anlamıyla bir yol adıyla eşleşiyor .abda/da[b/c]d

a{b,c}dolduğu parantez genişleme , bu POSIX tarafından şartnamede değildir. Bash el kitabının ilgili kısmı: (benim tarafımdan vurgu):

Ayraç genişletme, rastgele dizelerin üretilebileceği bir mekanizmadır . Bu mekanizma, dosya adı genişletme işlemine benzer (bkz. Dosya Adı Genişletme), ancak oluşturulan dosya adlarının bulunması gerekmez . Genişletilecek olan desenler isteğe bağlı bir başlangıç biçimini , ardından bir dizi virgülle ayrılmış dizi dizisi veya bir çift destek arasında bir sekans ifadesi ve ardından isteğe bağlı bir yazı yazısı şeklinde olur. Giriş, parantez içinde yer alan her dizeye önceden eklenir ve daha sonra, her bir sonuç dizisine soldan sağa doğru genişleyen postscript eklenir.

@ Mosvy'nin yorumuna göre, bu ilk olarak ortaya çıktı, cshancak içindeki davranış diğer kabuklardan bashfarklı csh. Bu tip tellerin genişlemesi de ayrıca mevcuttur glob(3).

{a..z}Yalnızca bash3.0'dan sonra ortaya çıkan başka bir küme genişletme türü daha var ve bash4.0'da daha fazla var .

Küreselleşmenin açık olduğu bir kabukta, boş bir klasörde yürütün, aşağıdaki sonuç döndürülür

$ echo a[bc]d
a[bc]d
$ echo a{b,c}d
abd acd

@ Jesse_b'in yorumuna cevap olarak, etkileşimli bir kabuk içindeyseniz ve her ikisi de geçerliyse, a[bc]dyazmakta daha az sorun olur. Örneğin grep pattern [ab][12].txt.


2
Brace genişlemesi bir "bashism" değildir; cshuzun zaman önce ilk ortaya çıktı bash. Ayrıca glob (3) kütüphane fonksiyonunda da bulunur. Aradaki fark, bashbaşka açılımlardan önce yapıldığında: a=A; ab=A/B; ac=A/C; echo $a{b,c}bash içerisinde diğer tüm kabuklardan farklı çalışacaktır.
mosvy

Teşekkür ederim. Cevabı güncelleyeceğim.
Weijun Zhou
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.