intranet-regex

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.

 

Sed'de Regex Kullanımı

 

. (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/[AZ]/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

=> Adana-1234567
 

$ 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

=> Trabzon – 61


 

* (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]