Home Map Index Search News Archives Links About LF
[Top Bar]
[Bottom Bar]
[Photo of the Author]
Guido Socher 
Yazar Hakk�nda:
Linux' u sever. Çünkü özgür bir sistemdir ve bütün dünya çapinda Linux topluluklariyla çalismak ayrica büyük bir eglencedir. Yazar bos vakitlerini kiz arkadasiyla, BBC dünya servis radyosunu dinleyerek, bisikletini kirsal bölgelere sürerek ve  yazar Linux ile çalismaktan  zevk alir.

Yazara Gönderi
Içindekiler
Giris
Basit Bir Örnek
Sözdizim Kurallari
Metin yazimi için düzenli ifadelerin kullanimi

Düzenli Anlat�mlar

�eviri: �zkan �zer (G�zden ge�irilmekte)


Özet: eDüzenli ifadeler ileri seviyede içerige duyarli aramalarda ve metin degisiklikler için kullanilir. Bunlar çogu gelismis yazi islemcilerinde bulunabilir. Parser programlarinda ve dillerde.



Giris
Düzenli ifadeler, vi ve emacs gibi cogu yazim islemcilerinde, grep/ egrep gibi programlarin içerisinde ve awk, perl, ve sed gibi birçok dilde bulunabilir. 

Düzenli ifadeler, ileri seviyede içerige duyarli aramalarda ve metin biçimlendirilmelerinde kullanilir. Bir düzenli ifade metin seritine karsi eslestirilen bir modelin biçimsel bir tanimlamasidir. 

Birkaç yýl önce düzenli ifadeleri kullanan insanlar gördügümde, etkilenistim. Metin yazimi ve saatler alan arama isi birkaç saniye içerisinde yapilabilir. Ayni zamanda, ekranda aciklamalar gördügümde bir kelimeyi anlamadim. Buna ragmen onlar nasil çalistigini ögrenmeye kararliydim. Neredeyse onlarin kullaniminin nasil oldukça basit oldugunu buldum. Birkaç sözdizim kurallarini izlerler. 

Her nekadar düzenli ifadeler Unix dünyasinda oldukça genis bir yayilima sahipse de, "standart düzenli ifade dili" gibi birsey yoktur. Bu daha fazla birkaç farkli lehçeye benzer. grep programlarinin örnegin iki çesidi vardir;grep ve egrep. Ikiside azicik farkli yetenekleriyle düzenli ifadeleri kullanir. Perl düzenli ifadelerin en eksiksiz kümesine sahiptir.Sansa, hepsi benzer kurallari izler.Temel düsünceyi anladiginiz zaman, farkli lehçelerin detaylarini ögrenmek çok kolaydir. 

Bu makale size temelleri tanitacaktir ve program degisikleri ve yetenekleri hakkinda bilgi sahibi olabilmek için farkli programlarin kilavuz sayfalarina bakabilirsiniz. 

Basit Bir Örnek

Bir sirketin telefon listesine sahipsiniz ve suna benziyor: 
Telefon Isim Kimlik
     ...
     ...
3412    Bob 123
3834  Jonny 333
1248   Kate 634
1423   Tony 567
2567  Peter 435
3567  Alice 535
1548  Kerry 534
     ...
Bu 500 kisilik bir sirkettir. Verileri sadece ASCII yazi dosyalari seklinde saklamaktadirlar. Telefon numarasinin ilk rakami 1 olan insanlar 1. binada çalismaktadirlar. Kimler 1. binada calisiyorlar. 
Düzenli ifadeler sunu cevap verebilir:
grep '^1' phonelist.txt
or
egrep '^1' phonelist.txt
or
perl -ne 'print if (/^1/)' phonelist.txt
Kelimelerle bunun anlami, 1 ile baslayan tüm satirlari ara, "^" isareti bir satir baslangicinin karsiligidir. Sadece 1. karakter olarak bir satir 1'e sahipse, "^" tüm ifadeyi eslemek için zorlar.

Sözdizim Kurallari

Tek Karakterli Yapilar

Bir düzenli ifadenin temel insa blogu tek-karakterli yapidir. Sadece bu karakter ile eslesir. Tek-karakterli yapinin bir örnegi yukaridaki örnekteki 1'dir.Yazi içerisinde sadece 1 ile eslesir. 
Tek-karakterli yapi için bir diger örnek:
egrep 'Kerry' phonelist.txt
Bu yapi sadece tek-karakterli yapilardan olusur. (K,e... harfleri)

Karakterler bir küme içerisinde beraberce gruplandirilabilir. Bir küme bir çift açik ve kapali köseli parantezler ve bu parantezlerin arasindaki karakterlerin listesiyle gösterilebilir. Bir küme bütün olarak tek-karakterli bir yapidir. bu karakterlerden bir ve sadece bir tanesi eslenme için arama metninde gösterilmek zorundadir.Bir örnek:

[abc]    ya a, ya b, ya da c ile eslesen tek-karakterli bir yapidir.
[ab0-9]  ya a, ya b, ya da 0'dan 9'a kadar ASCII karakterler içinden biriyle eslesen tek-karakterli bir yapidir. 
         
[a-zA-Z0-9\-] Ya bir büyük harf, ya da küçük harf, bir rakam veyA eksi isareti ile eslesen tek-karakterli bir yapidir.

Sunu denyelim:
egrep '^1[348]' phonelist.txt
13,14 veya 18 ile baslayan tüm satirlari tarar. 

Biz en çok sadece bu ASCII karakterler ile eslesen ASCII karakterleri gördük. Fakat bazi ASCII karakterler özel anlamlara sahiptirler.Özel bir karakterin özel bir anþamindan kurtulmak için bir backslash'  tan  önce yazabilirsiniz. [a-zA-Z0-9\-] içindeki eksi isareti bunun için bir örnektir.Özel karakterlerin backslash ile kullanildigi  düzenli ifade dilinin birkaç lehçeleri vardir. Bu durumda normal anlami elde etmek için backslash'i kaldirmamiz gerekir.

Nokta önemli bir özel karakterdir. Yeni satir karakteri disinda hersey ile eslesir. Örnek:

grep '^.2' phonelist.txt
 veya
egrep '^.2' phonelist.txt
Ikinci konumu 2 olan tüm satirlari arar. ve birinci karakter olarak hiçbirsey tanimlanmamistir.

Kümeler küme taniminda "[" ' nin yerine "[^" 'nin kullanilmasiyla ters cevrilebilir. Buradaki "^" isareti satirin uzun olmadigi anlamina gelir.?? fakat "[" ve "^"  isaretlerinin birlesimi ters çevrilmis kümeyi gösterir. 

[0-9]    0'dan 9'a ASCII karakterler içinde bir rakam ile eslesen tek-karakterli bir yapidir.  
         
[^0-9]   Rakam olmayan herhangi bir karakter ile eslenir.
[^abc]   a,b, veya c olmayan herhangi bir karakterle eslesir. 
 .       Nokta yeni satir karakteri disinda hersey ile eslesir. Bu da [\n] ile benzerdir. \n yeni satir karakteridir.

^ ile baslayan tüm satirlari eslemek için, sunu yazabiliriz.
grep '^[^1]' phonelist.txt
veya
egrep '^[^1]' phonelist.txt

(Anchors?)

Bir satirin baslangicina tekabül eden "^" isaretini henüz bir önceki bölümde gördük. Anchors metinin herhangi  bir karakteri için degil metin içinde herhangi bir konunmla eslesen düzenli bir ifadedir.
^  Bir satirin baslangicina tekabül eder.
$  Bir satirin sonuna tekabül eder.
phonelist.txt ' teki kimlik numarasi 567 olan insanlari aramak için sunu kullaniriz:
egrep '567$' phonelist.txt
Bu satir sonunda 567 numarali satirlari arar.

Çogalticilar

Bir çogaltici bir metin içindeki tek-karakterli yapinin ne kadar siklikla  vuku buldugunu? belirler.
 
tanim grep egrep perl vi vim vile elvis emacs
0 ve daha fazla * * * * * * * *
Bir ve daha fazla \{1,\} + +   \+ \+ \+ +
0 ve bir kere \? ? ?   \= \? \= ?
n'den m'e kadar \{n,m\}   {n,m}       \{n,m\} \{n,m\}

Not: Çesitli VIlar yukarida gösterildigi gibi çalismak için  sihirli seçenek kümeleri vardir.

Telefon listesinden bir örnek:

....
1248   Kate 634
....
1548  Kerry 534
....
***1 ile baslayan bir satiri eslemek için,rakamlari var, To match a line that starts with a 1, has some digits, at least one space and a name that starts with a K we can write: 
grep '^1[0-9]\{1,\} \{1,\}K' phonelist.txt
veya * kullan ve [0-9] ve boglugu tekrar et:
grep '^1[0-9][0-9]*  *K' phonelist.txt
veya
egrep '^1[0-9]+ +K' phonelist.txt
veya
perl -ne 'print if (/^1[0-9]+ +K/)' phonelist.txt
Çogaltici önceki tek-karakterli yapinin vukusunu çogaltir. Böylece "23*4", 2 sonra 3 hiçbir 4 anlamina gelmez. ("23,*4olacak). Bunun anlami "1 kere 2 sonra belki birkaç 3 ve bir 4 " ' tür.

Ayrica bir çogalticinin açgözlü oldugunu belirtmek çok önemlidir. Bu yapi içerisindeki birinci çogalticinin saga dogru olabildigine uzadaigi anlamina gelmez. 

^1.*4 ifadesi bütün satir ile eslesir. 
1548  Kerry 534 baslangici en son 4'e kadar düzenler. 
Sadece 154 ile eslesmez.
Bu grep için büyük bir fark yapmaz. Yazim ve biçimleme için önemlidir.

Bir Hafiza Olarak Parantezler

Bir hafiza olarak parantezler ifadenin yöntemini degistirmez, fakat sebeplerin yerine sonradan tercih edilsin diye ilistirilmis metin parcasi hatirlanmali

Hatirlanan parça kullanisli vi degiskenleridir. Bir hafiza olarak parantezlerin birinci yapisi  kullanisli vi degiskenleridir.Ikinci yapi ise kullanisli vi degiskeni 2 ve 3 olarak devam eder.
 
Program ismi Parantez Sözdizimi Degisken Sözdizimi
grep \(\) \1
egrep () \1
perl () \1 or ${1}
vi,vim,vile,elvis \(\) \1
emacs \(\) \1

Örnek:

[a-z][a-z]ifadesi iki küçük harf ile eslesir.   
Simdi "otto" yazisi gibi yazilari arastirmak için bu deiskenleri kullanabiliriz: 
egrep '([a-z])([a-z])\2\1'

\1 degiskeni o harfini ve \2 degiskeni t harfini içermez.

Ifade anna ismi ile eslesecektir, fakat yxyx ile eslenmeyecektir.
Bir hafiza olarak parantezler yapilari otto ve anna gibi isimleri bulmak için çok fazla kullanilmaz, fakat yazim ve biçimleme için daha fazla kullanilir.

Düzenli Ifadelerin Metin Yazimi için Kullanimi

Yazim islemini yapabilemk için vi ve emacs gibi yazim islemcilerine ihtiyaç duyulur veya perl'ü kullanabilirsiniz.

Emacs'ta In  M-x query-replace-regexp' i kullanirsiniz veya    query-replace-regexp'i bazi fonksiyon tuslarina koyarsiniz veya seçime bagli olaraktan replace-regexp komutunu kullanabilirsiniz.digerini degil.

Vi'da biçimleme komutu :%s/ / /gc'dir. Yüzde isareti tüm dosya analamini tasir?? ve herhangi uygun bir diziyle yer degistirebilir. Örnein vim'de shift v yazdiginizda bir bölgeyi isaret eder ve sonra biçimlemeyi sadece  bu bölge üzerinde yapar. Burada vim hakkinda daha fazla birsey aciklamayacagim bu konu kendi üstünde bir konu olacaktir. "gc" etkilesimli sürümdür. Etkilesimsizlik s/ / /g.

Etkilesimlilik degisimi calistirmak için herbir eslemede sevk edilip edilmedigidir.

Perlde sunu kullanabilirsiniz

perl -pe 's/ / /g' 
Beraber birkac örnege bakalim. Sirketimizdeki sayim plani degisti ve bütün 1 ile baslayan telefon numaralarina ikinci rakamdan sonra 2 konuldu.

Bunun anlami örnegin 1423 yerine 14223 olmali:

Eski liste:

Telefon Isim Kimlik
     ...
3412    Bob 123
3834  Jonny 333
1248   Kate 634
1423   Tony 567
2567  Peter 435
3567  Alice 535
1548  Kerry 534
     ...
Buradaki nasil yapildigidir.
vi:    s/^\(1.\)/\12/g
emacs: ^\(1.\)   replaced by  \12
perl:  perl -pe 's/^(1.)/${1}2/g' phonelist.txt

Simdi yeni telefon listesi sunun gibidir.

Telefon Isim Kimlik
     ...
3412    Bob 123
3834  Jonny 333
12248   Kate 634
14223   Tony 567
2567  Peter 435
3567  Alice 535
15248  Kerry 534
     ...
Perl sadece 1'den 9'a hafiza degiskenlerinin  daha fazlasini ele alabilir. Bu nedenle \12 tabii ki bos olan12. degiskenin yerinedir. Bunu çözmek için sadece Perl ${1}'i kullanmamiz gerekir. 

Simdi listedeki düzenleme karismistir. Bunu nasil belirleyebilirsiniz? Sadece 5. konumda bir bosluk varsa  bunu test edebilirsiniz ve bir digerini koyarsiniz:

vi:     s/^\(....\) /\1  /g
emacs:  '^\(....\) '  '\1  ' ile yer degismistir.
perl:   perl -pe 's/^(....) /${1}  /g' phonelist.txt
Simdi telefon listesi suna benzer

Telefon Isim Kimlik
      ...
3412     Bob 123
3834   Jonny 333
12248   Kate 634
14223   Tony 567
2567   Peter 435
3567   Alice 535
15248  Kerry 534
      ...
Bir meslek arkadasim  elle, listeyi yazfi ve kazara birkaç bosluk koydu. Bunlari nasil uzaklastýrabiliriz? 
Telefon Isim Kimlik
      ...
3412     Bob 123
     3834   Jonny 333
12248   Kate 634
14223   Tony 567
 2567   Peter 435
3567   Alice 535
  15248  Kerry 534
      ...

Bu düzeltmeli:
vi:     s/^  *//  (a +'ya sahip olmadiginiz ii bosluk var)
emacs:  '^ +'  bos seritle yer degistirmistir. 
perl:   perl -pe 's/^ +//' phonelist.txt
Bir program yaziyorsunuz ve temp ve temporary gibi iki degiskeniniz var . Simdi counter adi verilen degisken ile temp'i yer degistirmek istiyorsununz Eger tem seriti counter ile henüz yer degistirdiyse temporary gercekten istedigimiz olmayan counterory olur. 

Düzenli ifadeler bunu yapabilir. Sadece temp [^o]) counter\1 ile yer degistirebilir. Bu temp ve o harfi degil.(Seçime bagli bir çözüm sinirlari kullanmak için olcaktir, fakat henüz anchoring yapilarinin bu çesidini tartismadik. 

Umut ederim ki bu makale sizin ilginizi çekecektir. Simdi kilavuz sayfalatina bakmak ve gözde yazim islemcilerinizin belgelerine bakabilirsiniz ve detaylari ögrenebilirsiniz.
Ayrica e.g gibi birçok özel karakter vardir. . 

 

Iyi eglenceler, mutlu yazimlar 

Bu sanaly�renin bak�m� Miguel Angel Sepulveda taraf�ndan yap�lmaktad�r.
© Guido Socher 1998
LinuxFocus 1998