Regular Expressions (Düzenli İfadeler)
Düzenli ifadeler, belirli formattaki sözcük veya karakter gruplarını aramakta ve komutlar yardımıyla seri bir şekilde düzenlemekte kullanılır. Kısaca Regex denir.
. (nokta) Karakteri
Nokta (.) karakteri bütün karakterlerin yerine geçebilir. İlgili yerde bir karakter olması gerektiği anlamına gelir. Örneğin “A.B” ifadesi “ARB” , “ASB” , “A2B” veya “AzB” ve benzeri gibi bütün ifadelere eşittir.
Örnek:
Kazakistan'dan Rusya'ya kaçak olarak girmiş.
sed 's/ka.ak/Eflatun/g' ceren_dosya => Bu komut ceren_dosya içerisindeki kazak, kacak, kavak, ka5ak, ka/ak gibi ifadelerin hepsini “Eflatun” olarak değiştirir. Büyük/küçük harf duyarlılığı olduğu için "Kazakistan" kelimesinde bir değişiklik olmaz.
=> Kazakistan'dan Rusya'ya Eflatun olarak girmiş.
[ ] Karakteri
Birden fazla alternatif karakterin veya belirli bir aralıktaki karakterlerin eşleştirilmesi için kolaylık sağlar.
1-) Köşeli parantez [ ] içerisinde belirtilen karakterlerden herhangi birinin eşleşmesi durumunda işlem gerçekleşir.
Örnek-1:
1 2 3 4 5 6 7 8 9
sed 's/[2357]/ASAL/g' ceren_dosya => 2,3,5,7 sayılarının herbirinin yerine “ASAL” yazar.
=> 1 ASAL ASAL 4 ASAL 6 ASAL 8 9
Örnek-2:
sozcuk5 sozcuk2 sozcuk6 sozcuk-1 sozcuk3
sed 's/sozcuk[123]/Ankara/g' ceren_dosya => sozcuk1, sozcuk2, sozcuk3 ifadelerini “Ankara” kelimesi ile değişir.
=> sozcuk5 Ankara sozcuk6 sozcuk-1 Ankara
2-) Köşeli parantez [ ] belirli bir aralıktaki harf veya karakterler için arama yaparken de kullanılabilir.
Örnek-1:
1 TEMMUZ 2011 cuma
sed 's/[A–Z]/Mavi/g' ceren_dosya => Büyük küçük harf farketmeksizin alfabetik harflerin yerine “Mavi” yazar. Türkçe karakterler etkilenmez.
=> 1 MaviMaviMaviMaviMaviMavi 2011 MaviMaviMaviMavi
Örnek-2:
Bugün benim 26. doğumgünüm, 4 sene sonra 30 olacağım.
sed 's/.[4-8]/Yeşil/g' ceren_dosya => 4 ile 8 arasındaki rakamlar ile biten 2 haneli ifadelerin yerine “Yeşil” yazar.
=> Bugün benim Yeşil. doğumgünüm,Yeşil sene sonra 30 olacağım.
3-) Köşeli parantez [ ] içerisinde “^” işareti kullanmak belirli bir karakter kümesini hariç tutmak amacıyla kullanılır. Örneğin [^1-6] ibaresinde 1 ile 6 arasındaki rakamları hariç tutar.
Örnek:
a b c d e f
sed 's/[^abc]/Sarı/g' ceren_dosya => abc dışındaki karakterleri silerek yerine “Sarı” yazar.
=> a b c Sarı Sarı Sarı
4-) Köşeli parantez içerisinde birden fazla karakter aralığı da verebiliriz.
Örnek:
a B c ! ? @ 1 2 3
sed 's/[a-z0-9]/Kirmizi/g' ceren_dosya => harflerin ve rakamların yerine “Kirmizi” yazar. Noktalama işareti boşluk gibi karakterler aynı kalır.
=> Kirmizi Kirmizi Kirmizi ! ? @ Kirmizi Kirmizi Kirmizi
^ Karakteri
“^” karakteri satır başını temsil eder. Satır başında arama yapmak gerektiğinde kullanılabilir.
Örnek-1:
Araba Mavi
Mavi Araba
sed 's/^Mavi/Lacivert/' ceren_dosya => Bu komut sadece satır başlarındaki “Mavi” kelimesini “Lacivert” ile değiştirir. Satır başında olmayanlara dokunmaz.
=> Araba Mavi
=> Lacivert Araba
Örnek-2:
abcdef
-1234567
sed 's/^/Adana/' ceren_dosya => Her satır başına “Adana” yazar.
=> Adanaabcdef
$ Karakteri
“$” karakteri ise satır sonunu temsil eder. “^” karakterinin tam tersidir. Fakat “$” karakteri “^” karakterinin aksine “$ceren” şeklinde değil “ceren$” şeklinde kullanılır.
Örnek-1:
abcd ABCD abcd
sed 's/abcd$/12345/' ceren_dosya => Satır sonundaki “abcd” ifadesini “12345” olarak değiştirir.
=> abcd ABCD 12345
Örnek-2:
Şirinevler
sed 's/$/Basketbol Kulübü/' ceren_dosya => komutu her satır sonuna “Basketbol Kulübü” yazar.
=> ŞirinevlerBasketbol Kulübü
Örnek-3:
34 – İstanbul
61 – Trabzon
Trabzon – 61
sed '/Trabzon$/d' ceren_dosya => Sonu “Trabzon” ile biten satırları siler.
=> 34 – İstanbul
* (yıldız) Karakteri
Yıldız (*) karakteri kendisinden önce gelen ifadenin kaç defa geçtiğinin önemli olmadığını gösterir. Yani bir önceki ifade, hiç geçmese de, bir defa geçse de, beş defa geçse de eşleşme gerçekleşir.
Örnek:
selammmm sela
sed 's/selam*/Merhaba/g' ceren_dosya => Bu komut “sela”, “selam”, “selamm”, “selammm” gibi kelimeleri silerek yerine “Merhaba” yazar.
=> Merhaba Merhaba
1-) Hangi karakterlerden oluştuğunu bilmediğimiz belirsiz uzunlukta bir karakter kümesini gözardı ederek işlem yapılmasını istiyor isek “.” (nokta) ile beraber kullanabiliriz.
Örnek:
İstanbul Kabataş Lisesi
sed 's/İstanbul.*Lisesi/Okul/g' ceren_dosya => Bu komut “İstanbul Erkek Lisesi” “İstanbul 50. Yıl Lisesi” gibi metinleri silerek yerine “Okul” yazar.
=> Okul
2-) “ * ” karakteri [] ile beraber sıklıkla kullanılır
Örnek:
abc 7 d 123-99 6
sed 's/[0-9][0-9]*/Tamsayi/g' ceren_dosya => Bu komut bütün sayıları silerek yerine “Tamsayi” yazar.
=> Abc Tamsayi d Tamsayi-Tamsayi Tamsayi
Uyarı: Unutulmaması gereken nokta, “*” karakteri önceki karakterin hiç olmaması halinde de işlem yapacak olmasıdır. Örneğin sed 's/[a-z]*/!/g' ceren_dosya komutunu uyguladığımız takdirde sadece küçük harfleri ünlem ile değiştirmeyecek, her karakterden sonra da ünlem işareti koyacaktır.
& Karakteri
Mevcut metni koruyarak eklemeler yapmamızı sağlar.
Örnek-1:
1 Adana
22 Edirne
77 Yalova
Manisa
sed 's/^[0-9][0-9]/( & )/' ceren_dosya => Örnekteki “&” işareti değiştirilen kısımdaki metnin korunarak yazılmasını sağlar.
=> 1 Adana
=> ( 22 ) Edirne
=> ( 77 ) Yalova
=> Manisa
Örnek-2:
Ben internet tarayıcısı olarak Explorer kullanıyorum.
sed 's/Explorer/Internet &/g' ceren_dosya => Örnekteki “&” işareti değiştirilen kısımdaki metnin korunarak yazılmasını sağlar.
=> Ben internet tarayıcısı olarak Internet Explorer kullanıyorum.
\( \) Operatörü
1-) Gruplandırma yapmak için kullanılır. Oluşturulan gruplar sırasıyla numaralandırılarak çağrılmak üzere hafızaya kaydedilir. En fazla 9 grup oluşturulabilir.
Örnek:
şirinevler ceren ve yazılım
sed 's/\(ceren\)/\1 bilgisayar/g' ceren_dosya
Yukarıdaki komutta “ceren” kelimesine “1” rakamı atandı. Komut “ceren” kelimesini “ceren bilgisayar” şeklinde düzelterek gösterecektir.
=> şirinevler ceren bilgisayar ve yazılım
2-) “\( \)” operatörü “.” “*” ve “[]” ile beraber de kullanılabilir. Bu şekilde aramada bulunan belirsiz sonuç, bir bütün olarak korunarak çevresinde değişiklik yapılabilir.
Örnek-1:
1: Abcdef ghij
klmno
2: 12345678
sed 's/^\([1-9]\)/Madde-\1/g' ceren_dosya => 1'den 9'e kadar olan rakamlarla başlayan her satırın başına “Madde-” yazar ve sonrasında tekrar rakamı yazar. Örneğin satırın başında “1” yazıyorsa “Madde-1” olarak değişir
=> Madde-1: Abcdef abc
=> klmno
=> Madde-2: 12345678
Örnek-2:
Ali Bayar – İstanbul Teknik
Zeynep Şen – ODTÜ
Meral Ak – İstanbul Aydın
sed 's/\(İstanbul .*\)$/\1 Üniversitesi/g' ceren_dosya => Satır sonunda yer alan “İstanbul Teknik”, “İstanbul Kültür”, “İstanbul Arel” gibi ifadelerin sonuna “ Üniversitesi” yazar.
=> Ali Bayar – İstanbul Teknik Üniversitesi
=> Zeynep Şen – ODTÜ
=> Meral Ak – İstanbul Aydın Üniversitesi
3-) “\( \)” operatörü ardarda gelen kelimelerin yerlerini değiştirmek için de kullanılabilir. İlk kullanılan “\( \)” operatörü “\1” adlı alana, ikinci kullanılan ise “\2” adlı alan ile eşleşir.
Örnek-1:
Tahminen Samsun ile Balikesir arasi 700 km
Tahminen Samsun Balikesir arasi 700 km
sed 's/\(Samsun\) \(Balikesir\)/\2 \1/' ceren_dosya
Yukarıdaki komut “Samsun” ile “Balikesir” kelimelerinin yer değiştirmesini sağlar. Fakat Samsun ile Balıkesir kelimesi ardarda gelmiyorsa yer değiştirmez.
=> Tahminen Samsun ile Balikesir arasi 700 km
=> Tahminen Balikesir Samsun arasi 700 km
Örnek-2:
Tahminen Samsun ile Balikesir arasi 700 km
Tahminen Samsun Balikesir arasi 700 km
sed 's/\(Samsun\)\(.*\)\(Balikesir\)/\3\2\1/' ceren_dosya
Örnek-1 yerine komutumuzu bu şekilde yazarsak arada başka kelime olsa dahi yer değişecektir.
=> Tahminen Balikesir ile Samsun arasi 700 km
=> Tahminen Balikesir Samsun arasi 700 km
Karakter Sınıfları:
[[:alnum:]] Alfabetik harfler ve rakamları içerir. [a-z A-Z 0-9]
[[:alpha:]] Sadece Alfabetik karakterleri içerir. [a-z A-Z]
[[:blank:]] Boşluk (space ve tab) tuşlarını içerir.
[[:digit:]] Sadece numaraları içerir. [0-9]
[[:lower:]] Küçük harfleri içerir. [a-z]
[[:upper:]] Büyük harfleri içerir.[A-Z]
[[:punct:]] Noktalama işaretlerini içerir.
[[:space:]] enter, tab, space, NL, CR, FF gibi tuşları içerir.
[[:graph:]] Enter, tab, space dışında görünen karakterleri içerir. [[:^space:]]
[[:print:]] Görünen bütün karakterleri içerir. [.]
[[:xdigit:]] Hexadecimal karakterleri içerir. [0-9 a-f A-F]