Sed Komutu: Linux’ta Metin Düzenleme Sanatının İncelikleri

Kutay Utku
9 dk okuma

Linux ve Unix dünyasında metin işleme, sistem yöneticilerinin ve geliştiricilerin günlük işlerinin ayrılmaz bir parçasıdır. Bu dünyada sed (stream editor), metin manipülasyonu konusunda adeta bir İsviçre çakısı görevi görür. Bu kapsamlı rehberde, sed komutunun tüm detaylarını, pratik kullanım senaryolarını ve profesyonel ipuçlarını keşfedeceğiz.

📖 Sed Nedir ve Neden Bu Kadar Önemli?

Sed, 1970’lerin başında Bell Laboratuvarları’nda Lee E. McMahon tarafından geliştirilen bir akış editörüdür. Temel prensibi basittir: metni satır satır okur, belirtilen komutları uygular ve sonucu çıktı olarak verir. Sed’in gücü, komut satırında kompleks metin dönüşümlerini tek satırda gerçekleştirebilmesinden gelir.

Sed’in Avantajları:

  • Hız: Büyük dosyalarda bile anında işlem yapabilir
  • Otomasyon: Betikler içinde kullanıma uygun
  • Esneklik: Düzenli ifadelerle güçlü desen eşleme
  • Yaygınlık: Tüm Unix/Linux sistemlerde standart olarak bulunur

🛠️ Sed Seçenekleri: Derinlemesine İnceleme

-i Seçeneği: Doğrudan Dosya Düzenleme

# Örnek: Tüm "localhost" ifadelerini "127.0.0.1" ile değiştir
sed -i 's/localhost/127.0.0.1/g' config/*.conf

# Yedekli kullanım (önerilen)
sed -i.bak 's/eski/yeni/g' dosya.txt
# Bu komut hem değişiklik yapar hem de dosya.txt.bak oluşturur

# Birden fazla uzantılı yedek
sed -i'.backup.$(date +%Y%m%d)' 's/foo/bar/g' dosya.txt

Dikkat Edilmesi Gerekenler:

  • -i seçeneği orijinal dosyayı değiştirir
  • Önce test etmek için -i olmadan çalıştırın
  • Önemli dosyalarda mutlaka yedek alın

-e Seçeneği: Çoklu Komut Zincirleri

# Birden fazla işlemi tek seferde uygula
sed -e 's/foo/bar/' -e 's/baz/qux/' -e '/^#/d' dosya.txt

# Komutları satır içinde birleştirme
sed 's/foo/bar/; s/baz/qux/; 5,10d' dosya.txt

-n ve -p: Seçici Yazdırma

# Sadece 10-20. satırlar arasını göster
sed -n '10,20p' dosya.txt

# "error" içeren satırları ve bir sonraki satırı göster
sed -n '/error/{p;n;p}' logfile.txt

# "warning" içermeyen satırları göster
sed -n '/warning/!p' dosya.txt

-f Seçeneği: Script Dosyaları ile Çalışma

# Komutları script dosyasına yazalım
echo "s/foo/bar/g" > script.sed
echo "/^$/d" >> script.sed

# Script dosyasını çalıştır
sed -f script.sed dosya.txt

# Birden fazla script dosyası
sed -f script1.sed -f script2.sed dosya.txt

🚩 Sed Bayrakları: Detaylı Kullanım Senaryoları

g Bayrağı: Global Değiştirme

# Tüm eşleşmeleri değiştir
sed 's/test/deneme/g' dosya.txt

# Her satırdaki 2. eşleşmeyi değiştir
sed 's/test/deneme/2' dosya.txt

# 2. ve sonraki tüm eşleşmeleri değiştir
sed 's/test/deneme/2g' dosya.txt

i Bayrağı: Büyük/Küçük Harf Duyarsızlığı

# Case-insensitive değiştirme
sed 's/error/hata/gi' logfile.txt

# Bu komut şunları değiştirir:
# ERROR → hata
# Error → hata
# error → hata
# ErRoR → hata

p ve w Bayrakları: Çıktı Kontrolü

# "success" içeren satırları hem göster hem de dosyaya yaz
sed -n '/success/{p; w success.log}' system.log

# Farklı pattern'ları farklı dosyalara yaz
sed -n '/error/w error.log /warning/w warning.log /info/w info.log' app.log

x Bayrağı: Buffer Değişimi (İleri Düzey)

# Satırları ters sırada yazdır
sed '1!G;h;$!d' dosya.txt

# Her satırı bir üstteki satırla değiştir
sed -n 'x;p;${x;p}' dosya.txt

🔤 Düzenli İfadeler ve Özel Karakterler: Uzmanlık Seviyesi

Temel Meta Karakterler

# Satır başı işlemleri
sed 's/^/# /' dosya.txt            # Her satırı yorum satırı yap
sed '/^$/d' dosya.txt              # Boş satırları sil
sed 's/^[ \t]*//' dosya.txt        # Satır başındaki boşlukları temizle

# Satır sonu işlemleri
sed 's/\.$/!/g' dosya.txt          # Satır sonundaki noktaları ünlem yap
sed '/\.$/s/$/ Yeni metin./' dosya.txt  # Nokta ile biten satırlara ekleme yap

Nokta (.) ve Yıldız (*) Kullanımları

# Herhangi bir karakterle eşleşme
sed 's/a.c/XXX/g' dosya.txt        # "abc", "a c", "a-c" → "XXX"

# Tekrar operatörleri
sed 's/a*/b/g' dosya.txt           # "a", "aa", "aaa" → "b"
sed 's/ab*c/XXX/g' dosya.txt       # "ac", "abc", "abbc" → "XXX"

# Pratik örnek: HTML tag'lerini temizle
sed 's/<[^>]*>//g' index.html

Karakter Sınıfları ve Özel Diziler

# Rakamları temizle
sed 's/[0-9]//g' dosya.txt

# Noktalama işaretlerini kaldır
sed 's/[[:punct:]]//g' dosya.txt

# Birden fazla boşluğu tek boşluğa çevir
sed 's/[[:space:]]\+/ /g' dosya.txt

# Email adreslerini maskele
sed 's/[a-zA-Z0-9._%+-]\+@[a-zA-Z0-9.-]\+\.[a-zA-Z]\{2,\}/[EMAIL]/g' dosya.txt

💼 Gerçek Dünya Senaryoları

Senaryo 1: Log Dosyası Analizi

# Apache/Nginx log'larından IP adreslerini çek
sed -n 's/^\([0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+\).*/\1/p' access.log | sort | uniq -c

# Hata satırlarını ve context'lerini göster
sed -n '/ERROR/,+2p' application.log  # ERROR satırı ve sonraki 2 satır

Senaryo 2: CSV/TSV Dosya İşleme

# CSV'deki belirli bir sütunu değiştir
sed 's/^\([^,]*\),\([^,]*\),\([^,]*\)$/\1,\2,YENI_DEGER/' data.csv

# TSV'de boş değerleri "N/A" ile değiştir
sed 's/\t\t/\tN\/A\t/g; s/^\t/N\/A\t/; s/\t$/\tN\/A/' data.tsv

Senaryo 3: Kod Refactoring

# Tüm değişken isimlerini değiştir
sed -i 's/old_variable_name/new_variable_name/g' *.py

# Fonksiyon imzalarını güncelle
sed -i 's/def old_func(\(.*\)):/def new_func(\1):/' script.py

# Belirli bir blok içinde değişiklik yap
sed -i '/BEGIN_TRANSACTION/,/END_TRANSACTION/s/DEBUG/INFO/g' app.py

Senaryo 4: Sistem Yönetimi

# Hosts dosyasına yeni entry ekle
sed -i '$ a\192.168.1.100   server.local' /etc/hosts

# SSH config'inden belirli bir host'u çıkar
sed -i '/^Host oldserver/,/^Host/ { /^Host oldserver/d; }' ~/.ssh/config

# Disk kullanımı raporu hazırla
df -h | sed -n '2,$s/\([^ ]*\) *\([^ ]*\) *\([^ ]*\) *\([^ ]*\) *\([^ ]*\) *\(.*\)/\6 (\2 kullanılıyor, \4 boş)/p'

🎯 İleri Düzey Teknikler ve Performans İpuçları

1. Zincirleme Komutlar ve Gruplama

# Koşullu işlemler
sed '/pattern1/{s/foo/bar/; s/baz/qux/}' dosya.txt

# Etiketler ve dallanma
sed ':a; s/foo/bar/; ta' dosya.txt  # 'foo' kalmayana kadar değiştir

2. Hold ve Pattern Space Manipülasyonu

# Satırları ters çevir
sed '1!G;h;$!d' dosya.txt

# Satır çiftlerini değiştir
sed 'N;s/\n/ /' dosya.txt  # Her iki satırı birleştir

3. Çoklu Dosya İşlemleri

# Tüm text dosyalarında değişiklik yap
find . -name "*.txt" -exec sed -i.bak 's/old/new/g' {} \;

# Değişiklik yapılan dosyaları listele
for file in *.md; do
    if sed -i 's/pattern/replacement/g' "$file"; then
        echo "Değiştirildi: $file"
    fi
done

4. Performans Optimizasyonu

# Büyük dosyalar için satır sınırlaması
sed '1,10000s/old/new/g' büyük_dosya.txt > yeni_dosya.txt

# Parallel processing (GNU Parallel ile)
parallel sed 's/old/new/g' {} ::: *.log

⚠️ Yaygın Hatalar ve Çözümleri

Hata 1: Özel Karakter Kaçırma

# YANLIŞ:
sed 's/$HOME/path/g' dosya.txt

# DOĞRU:
sed 's/\$HOME/path/g' dosya.txt
sed "s/$HOME/path/g" dosya.txt  # Çift tırnak kullanarak

Hata 2: Düzenli İfade Açgözlülüğü

# YANLIŞ (açgözlü eşleşme):
sed 's/<.*>//g' dosya.html  # Tüm satırı siler!

# DOĞRU (tembel eşleşme):
sed 's/<[^>]*>//g' dosya.html

Hata 3: Platform Farkları

# macOS/BSD sed için -i seçeneği farklı
sed -i '' 's/foo/bar/g' dosya.txt  # macOS
sed -i 's/foo/bar/g' dosya.txt     # Linux

📊 Sed vs Diğer Araçlar: Ne Zaman Sed Kullanmalı?

GörevSedAwkPerlPython
Basit metin değiştirme✅ Mükemmel⚠️ Aşırı⚠️ Aşırı⚠️ Aşırı
Satır bazlı filtreleme✅ İyi✅ Mükemmel✅ İyi✅ İyi
Sütun bazlı işlemler❌ Zayıf✅ Mükemmel✅ İyi✅ İyi
Kompleks veri yapıları❌ Zayıf⚠️ Orta✅ İyi✅ Mükemmel
Büyük dosya performansı✅ Mükemmel✅ İyi⚠️ Orta❌ Yavaş

🚀 Sed’i Bir Adım Öteye Taşıyın: Özel Fonksiyonlar

Bash profilinize ekleyebileceğiniz kullanışlı sed fonksiyonları:

# HTML/XML'den tag'leri temizle
function strip_tags() {
    sed 's/<[^>]*>//g'
}

# URL'leri decode et
function url_decode() {
    sed 's/%\([0-9A-F][0-9A-F]\)/\\\\x\1/g' | xargs -0 printf "%b"
}

# Markdown başlıklarını çıkar
function extract_headings() {
    sed -n 's/^#\+ \(.*\)$/\1/p'
}

# JSON'ı minify et
function minify_json() {
    sed ':a;N;$!ba;s/\n//g;s/  *//g;s/{ /{/g;s/ }/}/g;s/\[ /[/g;s/ \]/]/g;s/, /,/g;s/: /:/g'
}

📈 Sed Öğrenme Yol Haritası

  1. Başlangıç Seviyesi (1-2 hafta):
  • Temel s/old/new/ değiştirme
  • -i, -e, -n seçenekleri
  • g, i, p bayrakları
  1. Orta Seviye (1 ay):
  • Düzenli ifadeler (^, $, ., *)
  • Satır aralıkları (5,10p)
  • Adresleme ve koşullu işlemler
  1. İleri Seviye (2-3 ay):
  • Hold ve pattern space
  • Dallanma ve akış kontrolü
  • Çoklu satır işlemleri
  1. Uzman Seviyesi (6 ay+):
  • Performans optimizasyonu
  • Kompleks dönüşümler
  • Diğer araçlarla entegrasyon

📚 Kaynaklar ve İleri Okuma

  1. Resmi Dokümantasyon:
  • man sed
  • info sed
  1. Online Kaynaklar:
  1. Kitap Önerileri:
  • “sed & awk” by Dale Dougherty
  • “Mastering Regular Expressions” by Jeffrey Friedl

Son Söz

Sed, 50 yıldır Unix/Linux ekosisteminin temel taşlarından biri olmayı başarmıştır. Öğrenme eğrisi dik olsa da, bu araçta ustalaşmak size zamandan tasarruf, otomasyon gücü ve sistemleriniz üzerinde benzersiz bir kontrol sağlayacaktır.

Unutmayın: Sed bir araçtır, amaç değil. Doğru iş için doğru aracı seçmek her zaman önemlidir. Ancak sed’in gücünü anladığınızda, komut satırında yapabileceklerinizin sınırlarını hayal ettiğinizden çok daha öteye taşıyabilirsiniz.

# Öğrenmeye devam etmek için küçük bir alıştırma:
echo "Sed öğrenmek eğlencelidir!" | sed 's/eğlenceli/güçlü/'

Hatırlatma: Her zaman test ortamında deneyin, yedek alın ve komutlarınızı adım adım oluşturun. İyi çalışmalar! 🚀

💬 Yorum Bırak