# sed ile Dizeleri Ayırıcıya Göre Bölme: Tam Bir Kılavuz
Birçok veri işleme görevinde, büyük metin dosyalarındaki verileri belirli bir ayırıcıya göre bölmek gerekebilir. Örneğin, virgülle ayrılmış değerler (CSV) dosyalarını işlemek, günlük dosyalarından belirli bilgileri ayıklamak veya karmaşık metin formatlarını parçalara ayırmak gibi durumlar sıklıkla karşımıza çıkar. Bu tür görevlerde sed komutu, güçlü ve esnek bir çözüm sunar. Bu makalede, sed kullanarak dizeleri ayırıcıya göre nasıl böleceğinizi adım adım öğreneceğiz. Yeni başlayanlardan ileri düzey kullanıcılara kadar herkes için kapsamlı bir rehber sunuyoruz.
Öğrenme Yol Haritası
Bu kılavuz, sed ile dizi bölme konusunda farklı seviyelerdeki kullanıcılar için tasarlanmıştır:
Yeni Başlayan: Temel sed komutları ve basit dizi bölme örnekleri ile başlayacağız.
Orta Seviye: Gerçek dünya senaryoları ve optimizasyon ipuçları ele alınacak.
İleri Seviye: Performans analizi, özel durumlar ve gelişmiş teknikler incelenecektir.
Sed ile Dizi Bölmeye Giriş: Temel Kavramlar
sed (stream editor), metin dosyalarını düzenlemek için kullanılan güçlü bir komut satırı aracıdır. Normal ifadeler (regular expressions) kullanarak metin içindeki desenleri arar ve bu desenlere göre değişiklikler yapar. Dizeleri ayırıcıya göre bölmek için, sed‘in ikame (substitution) özelliğini kullanacağız. İkame işlemi, s/arama_deseni/değiştirme_deseni/ formatındadır.
sed‘in temel çalışma prensibi, girdiyi satır satır işleyerek her satır üzerinde belirtilen işlemleri uygulamasıdır. Bu nedenle, birden fazla ayırıcı içeren dizeleri işlemek için, sed komutunu dikkatlice oluşturmak önemlidir.
Sed ile Dizi Bölme: Adım Adım Uygulamalı Kılavuz (Yeni Başlayanlar)
Öncelikle basit bir örnek ile başlayalım. Şöyle bir dizimiz olsun: “elma,armut,muz”. Bu diziyi virgül (,) ayırıcısına göre bölmek istiyoruz. Aşağıdaki sed komutu bunu yapar:
echo "elma,armut,muz" | sed 's/,/ /g'
Bu komutta:
* echo "elma,armut,muz": “elma,armut,muz” dizisini ekrana yazdırır.
* |: Boru (pipe) işareti, echo komutunun çıktısını sed komutuna gönderir.
* sed 's/,/ /g': sed komutu. s ikame işlemini gösterir. ,, virgülü arar ve , boşlukla değiştirir. g bayrağı, satırda birden fazla virgül varsa hepsini değiştirir.
Çıktı: elma armut muz olacaktır.
Şimdi, noktalı virgül (;) ayırıcısını kullanarak başka bir örnek yapalım:
echo "Ankara;İstanbul;İzmir" | sed 's/;/\n/g'
Bu örnekte, noktalı virgülü yeni satır karakteri (\n) ile değiştirdik. Çıktı:
Ankara
İstanbul
İzmir
Bu şekilde, her bir şehir ayrı bir satıra yazılmış olur.
Gerçek Hayat Senaryoları ve Optimizasyon İpuçları (Orta Seviye)
Bir web sunucusunun log dosyasından belirli bilgileri ayıklamak istediğimizi düşünelim. Log dosyasında her satır şu formatta olsun:
192.168.1.100 - - [20/Oct/2023:10:00:00 +0300] "GET /index.html HTTP/1.1" 200 1234
Bu satırdan IP adresini ayıklamak için aşağıdaki sed komutunu kullanabiliriz:
sed 's/^\([0-9.]*\) - - \[.*\] ".*" [0-9]* [0-9]*$/\1/' log.txt
Bu komutta:
* ^: Satır başlangıcını belirtir.
* \([0-9.]*\): IP adresini yakalayan bir grup oluşturur. [0-9.]*, bir veya daha fazla rakam veya nokta karakterini temsil eder.
* - - \[.*\] ".*" [0-9]* [0-9]*: IP adresi dışındaki diğer kısımları eşleştirir.
* $: Satır sonunu belirtir.
* \1: Yakalanan ilk grup (\([0-9.]*\)), yani IP adresi, çıktı olarak yazdırılır.
Optimizasyon İpuçları:
* Gereksiz işlemlerden kaçının. Sadece gerekli kısımları eşleştirin ve değiştirin.
* Normal ifadeleri optimize edin. Verimliliği artırmak için kısa ve öz ifadeler kullanın.
* Büyük dosyalar için sed‘in akış işleme özelliğini kullanın.
İleri Düzey Teknikler: Performans Analizi ve Özel Durumlar
Çok büyük dosyalarda sed kullanırken performans önemli bir faktör olabilir. Büyük dosyaları işlemek için sed‘in -i (inplace) seçeneğini kullanmaktan kaçının, çünkü bu işlem dosyayı tamamen belleğe yükler. Bunun yerine, sed çıktısını yeni bir dosyaya yönlendirin ve işlemi tamamlandıktan sonra eski dosyayı yeni dosya ile değiştirin.
Örneğin:
sed 's/,/ /g' büyük_dosya.txt > büyük_dosya_yeni.txt
mv büyük_dosya_yeni.txt büyük_dosya.txt
Özel Durumlar:
* Kaçış karakterleri: Özel karakterleri (örneğin, ., *, ?, +) normal ifadelerde kullanırken kaçış karakteri (\) kullanmanız gerekebilir.
* Çoklu ayırıcılı dizeler: Birden fazla ayırıcının kullanıldığı durumlarda, birden fazla sed komutu veya daha karmaşık normal ifadeler kullanmanız gerekebilir. Bu gibi durumlarda awk gibi daha güçlü araçlar kullanmak daha uygun olabilir.
* Karakter kodlamaları: Farklı karakter kodlamaları (örneğin, UTF-8, ISO-8859-1) kullanan dosyaları işlerken, sed‘in doğru karakter kodlamasını desteklediğinden emin olun.
Sonuç
Bu makalede, sed komutu kullanarak dizeleri ayırıcıya göre bölmenin farklı yöntemlerini inceledik. Basit örneklerden karmaşık senaryolara kadar geniş bir yelpazede sed‘in gücünü gösterdik. Unutmayın ki, büyük dosyaları işlerken performans optimizasyonu çok önemlidir. Ayrıca, farklı karakter kodlamaları ve özel durumlar için dikkatli olmak gerekir. [Fatih Soysal’ın](https://fatihsoysal.com) diğer Linux ve komut satırı makalelerine göz atarak bilgilerinizi daha da geliştirebilirsiniz.
Sıkça Sorulan Sorular:
1. sed‘in -i seçeneği ne işe yarar? -i seçeneği, sed komutunun değişiklikleri doğrudan dosyada yapmasını sağlar (inplace editing). Ancak büyük dosyalar için performans sorunlarına yol açabilir.
2. sed‘de normal ifadeler nasıl kullanılır? sed komutlarında normal ifadeler s/arama_deseni/değiştirme_deseni/ formatında kullanılır. arama_deseni, değiştirilecek deseni tanımlar.
3. sed‘de kaçış karakterleri ne zaman kullanılır? Özel karakterleri normal ifadelerde literal olarak kullanmak istediğinizde kaçış karakteri (\) kullanılır.
4. sed‘in performansını nasıl artırabilirim? Gereksiz işlemlerden kaçının, normal ifadeleri optimize edin ve büyük dosyalar için -i seçeneğini kullanmaktan kaçının.
5. sed yerine awk kullanmanın avantajları nelerdir? awk, daha güçlü bir metin işleme aracıdır ve karmaşık veri işleme görevlerinde sed‘den daha esnektir.
Yazar: Fatih Soysal
