Wildcards (Joker Karakter) Kullanımı
Wildcards yani joker karakterler, belirli tekrarlanır durumların (işlem, ifade vb.) tek seferde tanımlanmasını sağlayan özel karakterler olarak ifade edilebilir.
Görevleri önceden tanımlı ve geliştirilebilir olay ve kapsam örgüleri oluşturabilen joker karakterlere önceki yazılarda mümkün olduğunca yer vermiştim. Bu yazıda ise bahsi geçen karakterlerin karşıklıklarına daha detaylıca değinmek istiyorum1. GNU/Linux2 ve daha bir çok sistem dahilinde, programlama dillerinin, komutların çoğu tarafından desteklenen wildcards kullanımının odağında performans işlemleri yer almakta3. Tek seferde bir veya daha fazla işlemin tanımlanmasından belirtilen örgü (regex) tarafından eşleşenlerin edinimine bir çok şekilde kullanılabilmekte. Bu işlemlemler 2 ana yapı kapsamında ifade edilmekte. Çoğunlukla karşımıza çıkan kullanım biçimi4 olan Globbing patterns (standart joker karakterler) ve metin arama ve manüple etme amacıyla kullanılan regular expressions (düzenli ifadeler).
Wildcards (Joker Karakter) Kullanımı
Basit ifadelerden örgüler oluşturan blok ifadelere bir çok şekilde dosya/klasör ve metin işlemleri gerçekleştirmemize olanak sağlayan joker karakterleri kullanırken dikkat etmemiz gereken bir nokta var, komut satırı üzerinden bir dosya veya dizine referans gösterirken aslında bir yön (path) belirtmiş oluyoruz. Joker karakterlerle bu referans gösterme işlemi tek dosya yerine dosyalar, tek dizin yerine dizinlerin ve tek metin/karakter yerine karakter ve metinlerin referans gösterilmesi olarak özetlenebilir.
En basit ve yaygın joker karakterlerden biri yıldız (*
/ asterisk) olarak gösterilebilir. Temelde her şeyi kapsayan özelliği ile boşluk tanımlama amacıyla kullanılır. Örnek üzerinden açıklamak gerekirse aşağıdaki kod bulunulan dizinde adına bakılmaksızın uzantısı jpg
olan tüm dosyaları listeleyecektir.
ls -la *.jpg
Yukarıdaki kodda kullanılan yıldız (*
asterisk) herhangi bir isim karşılığı taşımaktadır.
Standard Wildcards (Globbing Patterns)
Standart joker karakterler (globbing patterns) çoğunlukla çoklu dosya işlemleri gerçekleştirmek amacıyla kullanılmakta. Neredeyse her komutla birlikte kullanılabilen bu karakterlerle ilgili detaylı bilgi için man glob
komutunu kullanabilirsiniz. O halde karakterlere biraz daha yakından bakalım.
? (question mark / soru işareti)
Herhangi bir karakteri ifade eder. Örneğin, bir klasör içerisinde **bg-*.jpg, bg-?.jpg, bg-A.jpg, bg-b.jpg, bg-0.jpg**…
gibi dosyalarımız olsun. Bu dosyaları listeleyebilmek için kullanacağımız komut şu şekilde olacaktır.
ls -la /Users/ceaksan/Desktop/lp/img/bg-?.jpg
?
kullanımını *
karşılaştırmasıyla birlikte iletiyorum.
* (asterisk / yıldız)
Yıldız karakteri “karakter(ler)” karşılığını vermektedir. Yukarıdaki örnekte tek karakter karşılığını veren soru işareti karakterinden farklı olarak eşleşmelerinde sayı limiti taşımaz.
[ ] (square brackets / köşeli parantez)
Tanımlı ifadeler ya da aralıklar kullanılabilir. Virgün belirtilen ifade alternatiflerini, orta tire/kısa çizgi işareti (-
, hyphen) ise tanımlı bir aralığı/diziyi belirtir.
Örneğin aşağıdaki kod 0 ile 9 arasındaki sayılarla eşleşen dosyaları listeleyecektir.
ls -la /Users/ceaksan/Desktop/lp/img/bg-[0-9].jpg
{ } (curly brackets / süslü ayraç / küme işareti)
Kullanımı köşeli parantez ile benzeşmektedir. Birden çok ifade virgülle belirtilir.
ls -la /Users/ceaksan/Desktop/lp/img/bg-{0-9}.jpg
\ (backslash / ters bölü)
“escape” karakter olarak ifade edilir. Özel karakterlerin yeteneklerini kaybedip karakter gibi davranmalarını sağlar. Örneğin, dizinimizde, adında *
karakterini barındıran bir dosyamız olsun. Bu dosyayı çağırmak için *
karakterini kullandığımızd diğer eşleşmeler de dahil edilecektir.
Yukarıdaki karakterleri ayrıca kullanmak için ters bölü ya da tek tırnak işareti kullanılabilir.
Regular Expressions
Daha öncesinde Regular Expressions (RegEx) ile ilgili detaylara değinmiştim5. Bu yazıda konuyla ilgili çok daha temel açıklamalarda bulunacağım.
. (dot / nokta)
Standard Wildcards altındaki soru işareti (?
) ile aynı özelliğe sahip.
.* (dot ve asterisk / nokta ve yıldız)
Standard Wildcards altındaki yıldız işareti (*
) ile aynı özelliğe sahip.
^ (caret / şapka / ters v)
“Satırın başındaki” şeklinde durum belirtir. Örneğin ^6
6 ile başlayan satırları ifade eder.
$ (dollar sign / dolar işareti)
“Satırın sonundaki” şeklinde durum belirtir. Örneğin ^0
0 ile biten satırları ifade eder. Yukarıdaki görselde bir çok özel karakterin yer aldığı bir işlemin gerçekleştiğini görebilirsiniz. Tanımlanan örgü dökümanın ilk ve sonuna bakıp örgü ile eşleşen alanları işaretlemekte.
| (vertical bar, düz çizgi)
“Ya da” ifadesini temsil eder. Tırnak dışında ters bölü (\
, backslash) ile belirtilmezse pipe ifadesi olarak algılanacaktır.
[^]
[!]
gibi, “değil” ifadesini temsil eder. Örneğin aşağıdaki kod bg-
ile başlayan ve sonrasında 0 ile 9 arasında bir sayıyla devam eden tüm farklı tipteki dosyaları listeler. Buradaki düz çizgi (|
) özel karakter değil, ls koduyla grep komutunun beraber işlenmesini sağlayan pipe
ifadesidir. Grep listelenen dosyalar arasından 6 ile 9 arasında olmayanları işaretler. Aşağıdaki görselde farklı şekillerde de kullanımlarını görebilirsiniz.
ls -la bg-[0-9].* | grep -v "bg-[^6-9]"
POSIX Standard Temelli Tanımlandırmaları
[:alnum:]
alfanümerik karakterler6[:alpha:]
alfabetik karakterler[:cntrl:]
kontrol karakterler7[:digit:]
0’dan 9’a rakamlar.[:xdigit:]
heksadesimal sayılar.[:graph:]
grafiksel olarak yazdırılabilir karakterler (boşluk hariç)[:lower:]
küçük harfler[:upper:]
büyük harfler[:print:]
grafiksel olarak yazdırılabilir karakterler (boşluk dahil)[:punct:]
noktalama işaretleri8[:space:]
boşluk, tab, yeni satır vb.