Linux Regüler İfadeler (Regular Expressions)
Regüler ifade ile belirtilen temelde katar kümeleridir. Katar kümeleri oluşturulurken kullanılan özel karakterler sayesinde birden fazla katar bulunabilir.
Özel anlamı bulunmayan karakterler sadece kendileri yerlerine kullanılırlar. Tanımlı olan özel karakterler özel işlevleri yerine kendileri olarak kullanılmak istendikleri zaman ters slash “ \ ” karakteri ile birlikte kullanılmak zorundadırlar. Köşeli parantezler “[] “ arasında bulunan karekter listesi , o listedeki herhangi bir karakteri eşleştirir. Eğer karakter kümesi “^” karakteri ile başlıyor ise küme içinde tanımlanan karakterler dışındaki karakterler eşleştirilir. Örnek vermek gerekirse ‘[abcd]’ ile belirtilen regüler ifade a,b,c veya d harflerinin herhangi bir ile eşleşir. ‘[1234567890]’ ise herhangi bir tek basamaklı sayı ile eşleşir.İstendiği takdirde ASCII karakterler için “-“ karakteri kullanılarak bir bölge tanımı yapılabilir. Örnek vermek gerekirse ‘[a-z] ‘ ile a’dan z’ye kadar olan harflerden herhangi biri ile eşleşilebilir.
İstendiği takdirde regüler ifade tanımları içinde karakter kümeleri de kullanılabilir. Karakter sınıfları LC_CTYPE çevre değişkeni ile belirtilen dile göre değişebilmektedir. Eğer LC_CTYPE değişkenine hiçbir şey atanmamış ise varsayılan olarak POSIX karakter sınıfları kullanılır :
Temel karakter sınıfraları ve içerikleri aşağıdaki gibidir :
- [:alpha:] : Herhangi bir harf yerine geçmektedir.
- [:digit:] : ‘0 1 2 3 4 5 6 7 8 9 ‘ rakamlarından biri yerine geçmektedir.
- [:alnum:] : Hem [:digit:] hemde [:alpha:] karakter sınıflarını kapsamaktadır. Bu iki sınıftan birine dahil olan karakterlerin yerine geçmektedir.
- [:lower:] : Küçük harf karakterlerin yerine geçmektedir.
- [:upper:] : Büyük harf karakterlerin yerine geçmektedir.
- [:blank:] : Boşluk ve tab karakteri yerine geçmektedir.
- [:punct:] : ` ! “ # $ % & ‘ ( ) * + , – . / : ; < > = ? @ [ ] \ ^ _ { } | ~ karakterleri yerine geçmektedir.
- [:graph:] : [:alnum:] veya [:punct:] olamayan karakterlerin yerine geçmektedir.
- [:xdigit:] : ‘abcdefABCDEF0123456789’ karakterleri yerine geçmektedir.
Bazı karakterlerin özel işlevleri bulunmaktadır. Bu karakterler ve işlevleri ağağıdaki gibidir :
- . : Nokta karakteri herhangi bir karakter yerini tutabilmektedir.
- ^ : ^ krakteri satır başı anlamına gelmektedir. Köşeli parantezler [] arsında ilk karakter olarak kullanılırsa , parantezler arasındaki karakterler dışındaki karakterlerin eşleştirilmesini sağlar. Eğer köşeli parantezler içinde ilk karakter değil ise hiç bir özel işlevi yoktur.
- $ : Dolar karakteri satır sonu anlamına gelmektedir.
- \< : Kelime başı anlamına gelmektedir.
- \> : Kelime sonu anlamına gelmektedir.
Regüler ifade tanımlarında tekrar öperatörlü olarak adlandırılan özel karakterler de kullanılabilir :
- ? : Kendinden önceki öğe seçime bağlıdır ve en fazla bir defa eşleştirilir.
- * : Kendinden önceki öğe sıfır veya daha fazla eşleştirilebilir.
- + : Kendinden önceki öğe en az bir kere eşleşmelidir.
- {N} : Kendinden önceki öğe tam olarak N kere eşleşmelidir.
- {N,} : Kendinden önceki öğe N veya daha fazla kez eşleşmelidir.
- {N,M} : Kendinden önceki öğe en az N , en çok M defa eşleşmelidir.
Ayrıca \w sembolü [[:alnum:]] ile , \W sembolü de [^[:alnum]] ile eşdeğerdir. Yani \w sembolü ile kelime içinde bulunabilecek karakterler belirtilirken , \W sembolü ile de kelime içinde bulunamayacak karakterler belirtilir.
Regüler ifade tanımları istendiği takdirde “ | “ karakteri ile “veya (or)” işlevi ile birleştirilebilir. Bu durumda birleştirilen tanımlardan birine uyan bilgiler , birleştirilmiş tüm tanıma uymuş olacaktır.
Özel karakterlerin çoğu köşeli parantezler arasında kullanıldığında işlevlerini kaybederler. Bazı karakterler için özel yerleştirme kuralları vardır. “ ^ ” karakteri köşeli parantezler arasında ilk karakter olduğu takdirde özel bir anlam taşıyacaktır. Bu yüzden bu karakterin kendi seçilmek istendiğinde ilk karakter olarak konulmamalıdır. ‘ –‘ karakteri de en son karakter olarak kullanıldığı durumda özel anlam taşımamaktadır. ‘ ] ‘ karakterinin kendisi seçilmek isteniyor ise bu karakter listenin ortasında bir yere konulmalıdır.
Parantezler () gruplama yapmak için kullanılırlar. Aynı zamanda parantezler arasında tanımlanan regüler ifade tanımlarına uyan katarlara regüler ifade tanımında referans verilebilir. \N ile N. Parantezler arasındaki regex’e uyan katar belirtilir.
Örnek vermek gerekirse ;
Linux İşletim Sistemi öğrenmek için Linux Sertifika Programı
Geleceğin isletim sistemi olamaya aday Linux isletim sistemi
Linux Sertifika Programı
İçerikli dosya üzerinde aşağıdaki regexleri göz önüne alalım.
(\w+)[[:blank:]]+.*\1
(\w+) tanımı ile kelime karakterlerinden oluşan ve en az bir karakter içiren bir katar tanımlanmaktadır. [[:blank:]]+ tanımı ile boşluk veya tab karakterlerinden herhangi birinden en az bir tane olması gerektiği belirtilmiştir. .* tanımı ile de boşluktan sonra istenilen sayıda istenilen karaktarlerden oluşan katarların bulunabileceği belirtilmiştir. \1 ifadesi ile de (\w+) ifadesine uyan katar referans edilmiştir.
[tufan@atlas kurs_ornek]$ egrep -w ‘(\w+)[[:blank:]]+.*\1’ regex
Linux İşletim Sistemi öğrenmek için Linux Sertifika Programı
Geleceğin isletim sistemi olamaya aday Linux isletim sistemi
-w anahtarı ile bulma işleminin sadece bulunan katar tam kelime olduğı takdirde doğru olması sağlanmıştır. Bu anahtarın kullanılması yerine arama kriterlerine kelime başı “ \<” ve kelime sonu “ \>” karakterleride eklenebilir.
[tufan@atlas kurs_ornek]$ egrep ‘\<(\w+)\>[[:blank:]]+.*\1’ regex
Linux İşletim Sistemi öğrenmek için Linux Sertifika Programı
Gelecegin isletim sistemi olamaya aday Linux isletim sistemi
-w anahtarı ile arama yapıldığı durumda (\w+) tanımına birinci satır için Linux , isletim kelimeleri seçilmektedir.
–w anahtarı kaldırılıp , kelime başı karakteri olmadan yapılan aramalarda üçüncü satırda kurala uymaktadır. Bu durumda (\w+) tanımı ile birinci satır için Linux , ikinci satır için in , üçüncü satır için a katarları seçilmektedir. Eğer kelime sonu karakteride arama tanımından kaldırılacak olursa , birinci satır için Linux , ikinci satır için e , üçüncü satır için i katarları secilecektir.
Örnek : Tekrar öperatörlerinin kullanımı
aaaabbbbbcccccddeeee şeklinde bir satırımız olduğunu düşünelim.
a*b*c*d*e* regex’ini ele alırsak. Bu regex sayesinde tüm satır için eşleştirme yapılmış olur. Çünkü her harf için sıfır veya daha fazla tekrara izin verilmektedir. Bu durumda her karakterin sıfır kere tekrarına izin verildiğinden boş satırlarda bu regex için uygundur. Boş satırların uygunluktan çıkarılması için herhangi bir karakter için en az bir defa bulunmasını zorunlu kılmak yeterli olacaktır. Yani a+b*c*d*e* regexi kullanıldığı takdirde boş satırlar seçilmeyecektir.
[tufan@atlas kurs_ornek]$ egrep ‘a*b*c*d*e*’ regex1
aaaabbbbbcccccddeeee
[tufan@atlas kurs_ornek]$ egrep ‘a+b*c*d*e*’ regex1
aaaabbbbbcccccddeeee
[tufan@atlas kurs_ornek]$
Eğer ab*c*d*e* regex’i kullanılır ise bu dururmda tüm satır eşleşmez. Çünkü bu regex tanımında “a” karakterinin tekrarına izin verilmemiştir. Bu yüzden bu regex ile sadece bir “a” karakteri eşleşir.Diğer b,c,d,e karakterleri için sıfır tekrara izin verildiğinden bu karakterler eşleşmezler. Bu karakterlerden bir tanesi için en az bir adet bulunması zorunlu kılınırsa bu durumda son “a” karakteri ve b,c,d,e karakterleri eşlemeye dahil olurlar. Her iki durumda da aramaya uyan katar bir kelime olmadığı için –w seçeneği ile birlikte eşleşme olmayacaktır.
[tufan@atlas kurs_ornek]$ egrep ‘ab*c*d*e*’ regex1
aaaabbbbbcccccddeeee
[tufan@atlas kurs_ornek]$ egrep ‘ab+c*d*e*’ regex1
aaaabbbbbcccccddeeee
[tufan@atlas kurs_ornek]$ egrep -w ‘ab+c*d*e*’ regex1
[tufan@atlas kurs_ornek]$ egrep -w ‘ab*c*d*e*’ regex1
a{2}b*c*d*e* tanımını ele alırsak , a karakterinin tam olarak 2 kere , diğer karakterlerin sıfır veya daha fazla eşleşmesi istenmektedir. Bu durumda sadece iki “a” karakteri arama kriterine uymaktadır. b,c,d,e karakterleri eşleşmezler. Bunu önlemek için b,c,d,e karakterlerinden herhangi birinin en az bir defa bulunmasını istemek (Örneğin a{2}b+c*d*e*) yeterli olacaktır. Her iki durumda da bulunan katar tam bir kelime olmadığından –w seçeneği ile eşleşme olmayacaktır.
a{2,}b*c*d*e* tanımı ile tüm satır eşleşmektedir. “a” karakteri için en az iki defa bulunaması zorunluluğu getirilmiş fakat en çok ne kadar bulunacağı belirtilmemiştir. Bu sebepten dolayı satırda bulunan 4 a karakteri de eşleşecektir. b,c,d,e karakterleri için sıfır veya daha çok tekrara izin verildiğinden tüm ,bc,d,e karakterleri eşleşmeye dahil olur. Eşleşmeye giren katar bir kelime olduğu için –w seçeneği ile de eşleşme gerçekleşir.
[tufan@atlas kurs_ornek]$ egrep -w ‘a{2,}b*c*d*e*’ regex1
aaaabbbbbcccccddeeee
[tufan@atlas kurs_ornek]$
Örnek : Köşeli parantezler arasında tanımlanan karakter dizilerinin kullanımı
abcd1234ABCD
qwertxyz
satırlarından oluşan bir dosyamız olduğunu düşünelim.
[a-d] tanımı ile a ile d karakterleri arasında kalan karakterlerden birinin eşleşmesi sağlanacaktır. Bu durumda birinci satırda bulunan “a” karakteri sadece eşleşmeye girecektir. İkinci satırda hiç bir karakter eşleşmeye giremeyecektir. [a-d]{3} regexi kullanıldığı takdirde a ile d arasındaki karakterlerden her hangi biri eşleşmeye girebilecek fakat 3 karakter eşleşme zorunluluğu bulunacaktır. Eşleşmeye dahil olacak 3 karakterin aynı olma zorunluluğu bulunmamaktadır. Bu durumda birinci satırdaki ‘abc’ katarı eşleşmiş olacaktır. [^0-9] tanımı ile rakam olamayan karakterlerin eşleştirilmesi sağlanmaktadır. Bu regex ile iki satırda seçilecektir. Çünkü birinci satırdan “a” karakteri , ikinci satırdan “q” karakteri bu regex ile eşleşecektir. Bu durumda hiç bir kelime eşleşmediği için –w seneği ile satırların hiç biri seçilemeyecektir. [^0-9]* regexi kullanıldığı takdirde yine her iki satır da seçilecektir. Tek fark birinci satırdan ‘abcd’ katarı , ikinci satırdan ‘qwertxyz’ katarı eşleşecektir. Bu durumda ikinci satırda oluşan eşleşme bir kelime olacağından –w seçeneği ile eşleşmesi mümkündür.[tufan@atlas kurs_ornek]$ egrep ‘[^0-9]’ regex2
abcd1234ABCD
qwertxyz
[tufan@atlas kurs_ornek]$ egrep -w ‘[^0-9]’ regex2
[tufan@atlas kurs_ornek]$ egrep ‘[^0-9]*’ regex2
abcd1234ABCD
qwertxyz
[tufan@atlas kurs_ornek]$ egrep -w ‘[^0-9]*’ regex2
qwertxyz
[tufan@atlas kurs_ornek]$