Sunucu Yönetimi & Linux

    sed ile Metin Düzenleme ve Değiştirme

    sed akış editörüyle metin dosyalarında toplu arama değiştirme ve satır düzenleme yapmanın pratik rehberi.

    13 dk okuma Güncellendi: 10 Temmuz 2026

    Bir sunucuda çalışırken er ya da geç şu ihtiyaçla karşılaşırsınız: onlarca yapılandırma dosyasındaki aynı ayarı değiştirmek, bir log dosyasından belirli satırları temizlemek ya da bir kurulum betiğinin ortasında bir parametreyi otomatik olarak güncellemek. Bunu her seferinde elle bir editör açıp yapmak hem yavaştır hem de hataya çok açıktır. İşte bu noktada sed devreye girer. sed (stream editor, yani akış editörü) metni satır satır okuyup üzerinde tanımladığınız kuralları uygulayan, klavye başında oturmanıza gerek kalmadan çalışan bir düzenleme aracıdır.

    Bu rehberde sed komutunu sıfırdan, gerçek sunucu senaryolarıyla ele alacağız. Temel arama-değiştirme mantığından başlayıp -i ile dosyayı yerinde güncellemeye, satır aralıklarıyla çalışmaya, satır silip eklemeye ve düzenli ifadelerle (regex) güçlü desen eşleştirmeye kadar ilerleyeceğiz. Sonunda ise bir yapılandırma dosyasını betik içinden otomatik güncelleyen, üretim ortamında gerçekten kullanabileceğiniz bir örnek kuracağız. Linux komut satırına yeniyseniz, önce temel Linux komutları rehberimize göz atmanız takip etmeyi kolaylaştıracaktır.

    sed Nedir ve Nasıl Çalışır#

    sed bir akış editörüdür; yani girdiyi bir akış olarak, satır satır işler. Her satırı sırayla okur, üzerinde sizin verdiğiniz komutları uygular ve sonucu ekrana (standart çıktıya) yazar. Varsayılan davranışı hiçbir dosyayı değiştirmemektir: kaynak dosya olduğu gibi kalır, siz yalnızca dönüştürülmüş çıktıyı görürsünüz. Bu, sed'in en güvenli tarafıdır; bir komutu önce çalıştırıp sonucu gözle görüp, ancak sonrasında kalıcı hâle getirebilirsiniz.

    Temel çağrı biçimi şöyledir:

    sed [seçenekler] 'komut' dosya
    

    Örneğin bir dosyanın içeriğini olduğu gibi ekrana yazdırmak için p (print) komutunu kullanabilirsiniz. Ancak sed her satırı zaten otomatik yazdırdığı için, p ile birlikte satırlar iki kez görünür. Bunu engellemek isterseniz -n seçeneği otomatik yazdırmayı kapatır:

    # Sadece 1 ile 5 arasındaki satırları yazdır
    sed -n '1,5p' erisim.log
    

    Buradaki mantık sed'in tamamını anlamak için kritiktir: sed her satır için bir "desen alanı" (pattern space) oluşturur, komutlarınızı bu alana uygular ve döngünün sonunda (eğer -n verilmediyse) alanı yazdırır. Bir dosyayı ilk kez açtığınızda önce sadece görüntüleyip mantığı test etmeniz, tıpkı bir editörle çalışmadan önce dosyayı okumak gibi iyi bir alışkanlıktır.

    Temel Arama ve Değiştirme: s Komutu#

    sed'in en çok kullanılan komutu s'dir (substitute, yani değiştir). Sözdizimi şudur:

    sed 's/eski/yeni/' dosya
    

    Bu komut her satırda eski metnin ilk eşleşmesini yeni ile değiştirir. Dikkat edilmesi gereken nokta budur: varsayılan olarak yalnızca satırdaki ilk eşleşme değişir. Bir satırdaki tüm eşleşmeleri değiştirmek için sona g (global) bayrağını eklemeniz gerekir:

    # Satırdaki her "http" ifadesini "https" yap
    sed 's/http/https/g' baglantilar.txt
    

    Bayrakları ihtiyaca göre birleştirebilirsiniz. En çok kullandığınız bayraklar şunlardır:

    BayrakAnlamıÖrnek
    gSatırdaki tüm eşleşmeleri değiştirs/a/b/g
    iBüyük/küçük harf duyarsız eşleştirs/error/HATA/gi
    2Satırdaki yalnızca 2. eşleşmeyi değiştirs/,/;/2
    pDeğişen satırı yazdır (-n ile)sed -n 's/x/y/p'
    w dosyaDeğişen satırları belirtilen dosyaya yazs/x/y/w cikti.txt

    Ayraç olarak her zaman / kullanmak zorunda değilsiniz. Değiştireceğiniz metin dosya yolu gibi bolca / içeriyorsa, ayracı #, | ya da @ gibi başka bir karaktere değiştirmek okunabilirliği ciddi biçimde artırır:

    # Ayraç olarak # kullanınca yolları kaçış karakteri olmadan yazabilirsiniz
    sed 's#/var/www/eski#/var/www/yeni#g' vhost.conf
    

    Eşleşen metni sonuçta yeniden kullanmak için & sembolü çok işinize yarar; & eşleşen tüm ifadeyi temsil eder:

    # Her IP satırını köşeli parantez içine al
    echo "192.168.1.10" | sed 's/.*/[&]/'
    # Çıktı: [192.168.1.10]
    

    -i ile Yerinde Düzenleme ve Yedek Alma#

    Şimdiye kadarki tüm örnekler yalnızca ekrana yazdı; dosyaya dokunmadı. Değişikliği kalıcı yapmak, yani dosyayı yerinde düzenlemek için -i (in-place) seçeneği kullanılır:

    # Dosyayı doğrudan değiştir (geri dönüşü yok)
    sed -i 's/eski/yeni/g' ayar.conf
    

    Burada çok net bir uyarı yapmak gerekiyor: -i geri alınamaz. Yanlış bir desen yazarsanız dosya anında bozulur ve eski hâli kaybolur. Üretim sunucusunda bu davranışı asla yedeksiz kullanmayın. Neyse ki sed size yedek almanın hazır bir yolunu sunar: -i seçeneğine bir uzantı verirseniz, değişiklikten önce özgün dosyayı o uzantıyla saklar:

    # Değişiklikten önce ayar.conf.bak adıyla yedek al
    sed -i.bak 's/eski/yeni/g' ayar.conf
    

    Bu komut çalıştıktan sonra elinizde iki dosya olur: güncellenmiş ayar.conf ve dokunulmamış ayar.conf.bak. Bir şeyler ters giderse mv ayar.conf.bak ayar.conf ile anında geri dönebilirsiniz. Küçük bir taşınabilirlik notu: GNU sed (çoğu Linux dağıtımı) -i.bak yazımını kabul ederken, macOS/BSD sed boş bir yedek uzantısı için -i '' biçimini bekler. Betiklerinizi farklı sistemlere taşıyacaksanız bu farkı akılda tutun.

    Yerinde düzenleme öncesi en güvenli yaklaşım, komutu önce -i olmadan çalıştırıp çıktıyı gözle görmek, sonra emin olunca -i.bak eklemektir:

    # 1. Adım: önce sonucu ekranda kontrol et
    sed 's/^max_connections.*/max_connections = 200/' postgresql.conf
    
    # 2. Adım: sonuç doğruysa yedekleyerek uygula
    sed -i.bak 's/^max_connections.*/max_connections = 200/' postgresql.conf
    

    Adresler ve Satır Aralıkları#

    Şimdiye kadar komutlarımız dosyadaki her satıra uygulandı. sed'in asıl gücü, komutları yalnızca belirli satırlara uygulayabilen "adres" kavramında yatar. Bir komuttan önce adres yazarsanız, komut yalnızca o adrese uyan satırlarda çalışır.

    Adres bir satır numarası, bir aralık ya da bir desen olabilir:

    # Sadece 3. satırdaki değişikliği yap
    sed '3s/eski/yeni/' dosya.txt
    
    # 10 ile 20. satırlar arasında değişiklik yap
    sed '10,20s/eski/yeni/g' dosya.txt
    
    # 5. satırdan dosya sonuna kadar ($ = son satır)
    sed '5,$s/eski/yeni/g' dosya.txt
    

    En kullanışlı adresleme biçimi, satır numarası yerine bir desen vermektir. /desen/ biçimindeki bir adres, o deseni içeren satırları hedefler:

    # Sadece "Listen" kelimesini içeren satırda 80'i 8080 yap
    sed '/Listen/s/80/8080/' apache.conf
    

    İki deseni virgülle ayırarak bir aralık da tanımlayabilirsiniz. Bu, "şu satırdan bu satıra kadar" demenin desen tabanlı yoludur ve bir bloğun tamamını işlemek için çok değerlidir:

    # <VirtualHost> ile </VirtualHost> arasındaki her yorumu kaldır
    sed '/<VirtualHost/,/<\/VirtualHost>/s/^#//' vhost.conf
    

    Bir adresin sonuna ! eklerseniz mantık tersine döner: komut, adrese uyan satırlar dışındaki her satıra uygulanır. Örneğin yalnızca yorum olmayan satırlarda çalışmak için bu çok pratiktir:

    # Yorum (#) satırları hariç her satırda değişiklik yap
    sed '/^#/!s/eski/yeni/g' ayar.conf
    

    d ile Satır Silme, a i c ile Ekleme#

    Metin değiştirmenin yanında, sed satırları tamamen silebilir ya da araya yeni satırlar ekleyebilir. d (delete) komutu, adreslediğiniz satırları çıktıdan tamamen çıkarır:

    # 1. satırı sil (örneğin başlık satırını atmak için)
    sed '1d' veri.csv
    
    # Boş satırları sil (^$ = başı ve sonu bitişik, yani boş satır)
    sed '/^$/d' metin.txt
    
    # "DEBUG" içeren tüm satırları sil
    sed '/DEBUG/d' uygulama.log
    
    # 5 ile 10 arasındaki satırları sil
    sed '5,10d' dosya.txt
    

    Yeni satır eklemek için üç komut vardır ve aralarındaki farkı bilmek işleri kolaylaştırır. a eklediğiniz satırı hedefin altına, i üstüne koyar; c ise hedef satırı komple yeni içerikle değiştirir:

    # "server {" satırından sonra bir yeni satır ekle (append)
    sed '/server {/a\    client_max_body_size 50m;' nginx.conf
    
    # "listen 80;" satırından önce bir satır ekle (insert)
    sed '/listen 80;/i\    # HTTP dinleme portu' nginx.conf
    
    # "max_upload" ile başlayan satırı komple değiştir (change)
    sed '/^max_upload/c\max_upload = 128M' php.ini
    

    Aşağıdaki tablo bu üç komutu tek bakışta özetliyor:

    KomutNe yaparKullanım
    a\Eşleşen satırdan sonra eklerYeni ayar satırı iliştirmek
    i\Eşleşen satırdan önce eklerBaşlık/yorum satırı koymak
    c\Eşleşen satırı komple değiştirirBir satırı tümden yenilemek
    dEşleşen satırı silerGereksiz/boş satırları temizlemek

    Bu komutlar özellikle betiklerin içinde, editör açmadan yapılandırmaya satır eklemek için çok kullanışlıdır. Elle düzenleme yapacaksanız da nano veya vim editörü rehberimiz size yardımcı olur; ama toplu ve tekrarlanabilir işlerde sed klavyeye dokunmadan aynı sonucu verir.

    Düzenli İfadelerle Güçlü Eşleştirme#

    sed'in gerçek gücü düzenli ifadelerle (regex) ortaya çıkar. Sabit metin yerine desen tanımlayarak "rakamla başlayan satırlar", "belirli bir kalıba uyan IP adresleri" ya da "sonunda boşluk olan satırlar" gibi karmaşık hedefleri yakalayabilirsiniz. En sık kullandığınız temel regex parçaları şunlardır:

    SembolAnlamı
    ^Satır başı
    $Satır sonu
    .Herhangi tek karakter
    *Önceki öğenin sıfır veya daha fazlası
    [0-9]Bir rakam
    [a-zA-Z]Bir harf
    \{2,4\}Önceki öğenin 2 ile 4 tekrarı

    Varsayılan sed, temel düzenli ifadeler (BRE) kullanır; bu modda +, ?, (, ) gibi karakterlerin özel anlam kazanması için önlerine ters bölü (\) koymanız gerekir. Bu kaçış zorunluluğu okumayı yorar. Bunun yerine -E (ya da GNU'da -r) seçeneğiyle genişletilmiş düzenli ifade (ERE) moduna geçerseniz, bu karakterleri doğrudan yazabilirsiniz. Modern kullanımlar için -E çok daha okunaklıdır:

    # Satır sonundaki boşluk ve sekmeleri temizle
    sed -E 's/[[:space:]]+$//' dosya.txt
    
    # Ardışık birden fazla boşluğu tek boşluğa indir
    sed -E 's/ +/ /g' metin.txt
    
    # Basit bir IPv4 kalıbını maskele
    echo "Sunucu 203.0.113.45 uzerinden baglandi" | \
      sed -E 's/([0-9]+\.){3}[0-9]+/GIZLI/'
    # Çıktı: Sunucu GIZLI uzerinden baglandi
    

    Regex'in en güçlü özelliklerinden biri yakalama gruplarıdır. Bir deseni parantez içine alırsanız (-E modunda (...), temel modda \(...\)), yakalanan parçayı değiştirmenin sağ tarafında \1, \2 gibi geri referanslarla yeniden kullanabilirsiniz. Bu, alanların yerini değiştirmek ya da bir parçayı korurken etrafını değiştirmek için idealdir:

    # "Ad Soyad" biçimini "Soyad, Ad" biçimine çevir
    echo "Ahmet Yilmaz" | sed -E 's/([A-Za-z]+) ([A-Za-z]+)/\2, \1/'
    # Çıktı: Yilmaz, Ahmet
    
    # YYYY-AA-GG tarihini GG.AA.YYYY biçimine çevir
    echo "2026-07-10" | sed -E 's/([0-9]{4})-([0-9]{2})-([0-9]{2})/\3.\2.\1/'
    # Çıktı: 10.07.2026
    

    Config Dosyasını Betikle Otomatik Güncelleme#

    Şimdi öğrendiklerimizi gerçek bir otomasyon senaryosunda birleştirelim. Diyelim ki bir dağıtım (deployment) betiğinin içinde PHP'nin php.ini dosyasında birkaç ayarı standart değerlere çekmek istiyorsunuz. Elle her sunucuda düzenleme yapmak yerine, aşağıdaki gibi güvenli ve tekrarlanabilir bir Bash betiği yazabilirsiniz:

    #!/usr/bin/env bash
    set -euo pipefail
    
    DOSYA="/etc/php/8.2/fpm/php.ini"
    
    # Değiştirmeden önce zaman damgalı bir yedek al
    cp "$DOSYA" "${DOSYA}.$(date +%F-%H%M).bak"
    
    # Ayarları tek tek, satır başındaki değeri hedefleyerek güncelle
    sed -i \
      -e 's/^upload_max_filesize = .*/upload_max_filesize = 128M/' \
      -e 's/^post_max_size = .*/post_max_size = 128M/' \
      -e 's/^memory_limit = .*/memory_limit = 512M/' \
      -e 's/^;\?max_execution_time = .*/max_execution_time = 120/' \
      "$DOSYA"
    
    echo "php.ini guncellendi. Servis yeniden baslatiliyor..."
    systemctl reload php8.2-fpm
    

    Bu betikteki birkaç ince noktaya dikkat edin. Birincisi, her komuttan önce cp ile zaman damgalı bir yedek alıyoruz; bu, -i.bak'tan daha esnektir çünkü aynı dosyayı birden çok kez güncellesek bile eski yedekleri ezmeyiz. İkincisi, birden fazla değişikliği tek sed çağrısında yapmak için -e seçeneğini üst üste kullanıyoruz; bu, dosyayı defalarca açıp kapamaktan hem hızlı hem temizdir. Üçüncüsü, ^;\?max_execution_time deseni hem yorumlanmış (; ile başlayan) hem de aktif satırı yakalar, böylece ayar kapalı olsa bile açıp güncelleriz.

    Aynı yaklaşımı Nginx yapılandırmasında da kullanabilirsiniz. Örneğin bir sunucu bloğuna dosya yükleme sınırı eklemek ve varsa eski değeri güncellemek için:

    #!/usr/bin/env bash
    set -euo pipefail
    CONF="/etc/nginx/sites-available/site.conf"
    
    if grep -q "client_max_body_size" "$CONF"; then
      # Zaten varsa değeri güncelle
      sed -i.bak -E 's/(client_max_body_size).*/\1 100m;/' "$CONF"
    else
      # Yoksa server bloğunun içine ekle
      sed -i.bak '/server {/a\    client_max_body_size 100m;' "$CONF"
    fi
    
    # Değişikliği uygulamadan önce sözdizimini doğrula
    nginx -t && systemctl reload nginx
    

    Buradaki nginx -t adımı hayat kurtarır: değişikliği canlıya almadan önce yapılandırmanın geçerli olduğunu doğrular. Otomatik düzenleme yaparken böyle bir doğrulama adımını her zaman ekleyin. Bu tür işlemleri kendi sunucunuzda güvenle yapmak isterseniz, tam yönetici erişimi sunan VDS ve sanal sunucu çözümlerimize göz atabilir, sunucu bakım yükünü bize bırakmak isterseniz sunucu yönetimi hizmetimizden yararlanabilirsiniz.

    Sık Yapılan Hatalar ve Güvenli Kullanım#

    sed çok güçlü olduğu için, dikkatsiz kullanıldığında hasar da o kadar hızlı olur. En sık yapılan hata, -i seçeneğini yedek almadan doğrudan üretim dosyasında çalıştırmaktır. Alışkanlık hâline getirmeniz gereken kural basittir: önce -i olmadan çıktıyı gör, sonra -i.bak ile uygula. Bir başka klasik hata, ayraç karışıklığıdır; dosya yolu değiştirirken / yerine # ya da | gibi bir ayraç seçmek, hem okunabilirliği artırır hem de kaçış hatalarını önler.

    Regex ile çalışırken açgözlü (greedy) eşleşmelere de dikkat edin. .* deseni satırdaki mümkün olan en uzun parçayı yakalar; bu yüzden s/".*"/X/ gibi bir ifade, satırdaki ilk tırnaktan son tırnağa kadar her şeyi silebilir. Daha dar bir eşleşme için .* yerine "tırnak dışındaki karakterler" gibi daha belirgin desenler kullanmak gerekir. Son olarak, çok satırlı ve karmaşık dönüşümlerde sed sınırlarına ulaşırsanız awk ya da perl gibi araçların daha uygun olabileceğini unutmayın; sed satır bazlı işler için mükemmeldir, ama bir dosyanın tümünü birden gören karmaşık mantık için tasarlanmamıştır.

    Sıkça Sorulan Sorular#

    sed ile yaptığım değişikliği geri alabilir miyim?#

    Değişikliği yalnızca önceden yedek aldıysanız geri alabilirsiniz. sed -i seçeneği dosyayı yerinde ve geri dönüşsüz değiştirir; bu yüzden -i.bak biçiminde bir yedek uzantısı vermek ya da komuttan önce cp dosya dosya.bak ile kopya almak kritik önemdedir. Yedeğiniz varsa mv dosya.bak dosya komutuyla eski hâline anında dönebilirsiniz; yedek yoksa, sed'in dosyanın önceki içeriğini saklama gibi bir özelliği olmadığından değişiklik kalıcıdır.

    s komutunda neden sadece ilk eşleşme değişiyor?#

    Bunun nedeni s komutunun varsayılan davranışıdır. sed, her satırda sadece bulduğu ilk eşleşmeyi değiştirir ve bir sonraki satıra geçer. Bir satırdaki tüm eşleşmeleri değiştirmek istiyorsanız komutun sonuna g (global) bayrağını eklemeniz gerekir, örneğin s/eski/yeni/g. Yalnızca belirli bir tekrarı hedeflemek isterseniz de sayı bayrağı kullanabilirsiniz; s/,/;/3 ifadesi satırdaki yalnızca üçüncü virgülü değiştirir.

    sed ile awk arasındaki fark nedir?#

    İki araç da metin işler ama farklı işler için tasarlanmıştır. sed, satır bazlı arama-değiştirme, silme ve basit dönüşümler için idealdir ve düzenli ifadelerde çok güçlüdür. awk ise satırları sütunlara ayırıp alanlar üzerinde hesaplama, koşullu mantık ve raporlama yapmak için daha uygundur. Pratikte "şu deseni bununla değiştir" işi için sed, "üçüncü sütunun toplamını al" gibi işler için awk seçilir; çoğu zaman ikisi birlikte, boru (pipe) ile zincirlenerek kullanılır.

    Değiştireceğim metin bolca eğik çizgi içeriyorsa ne yapmalıyım?#

    Bu durumda ayraç karakterini değiştirmeniz en pratik çözümdür. sed, s komutunda ayraç olarak / yerine hemen hemen her karakteri kabul eder. Örneğin dosya yolu değiştirirken s/eski/yeni/ yerine s#/var/www/eski#/var/www/yeni#g yazarsanız, yolların içindeki eğik çizgileri kaçış karakteriyle uğraşmadan doğrudan yazabilirsiniz. #, |, @ ve ~ en sık tercih edilen alternatif ayraçlardır.

    sed betiğimde büyük/küçük harf duyarlılığını nasıl kapatırım?#

    Büyük/küçük harf duyarsız eşleştirme için s komutunun sonuna i bayrağını eklemeniz yeterlidir. Örneğin s/error/HATA/gi ifadesi; "error", "Error", "ERROR" gibi tüm yazımları yakalar ve g bayrağı sayesinde satırdaki her eşleşmeyi değiştirir. Adres olarak desen kullanıyorsanız GNU sed ile /desen/I biçiminde büyük I bayrağı da adres eşleşmesini harf duyarsız hâle getirir.

    Bir sunucuda sed komutumu canlı dosyada denemeden önce nasıl test ederim?#

    En güvenli yöntem, komutu önce -i olmadan çalıştırıp çıktıyı ekranda görmektir. sed 's/eski/yeni/g' dosya komutu dosyayı değiştirmeden yalnızca sonucu gösterir; deseninizin doğru satırları yakaladığından emin olduktan sonra aynı komuta -i.bak ekleyerek uygularsınız. Ayrıca sed -n '/desen/p' dosya ile yalnızca eşleşen satırları listeleyerek, değişiklikten önce hangi satırların etkileneceğini de kontrol edebilirsiniz. Yapılandırma dosyalarında ek olarak nginx -t ya da ilgili servisin doğrulama komutunu çalıştırmak, hatalı bir değişikliğin canlıya çıkmasını engeller.

    Kapanış#

    sed, ilk bakışta kriptik görünen ama mantığını kavradığınızda sunucu yönetiminin en verimli araçlarından birine dönüşen bir yardımcıdır. Tek bir arama-değiştirme kısayolundan başlayıp, adreslerle belirli satırları hedefleyen, düzenli ifadelerle karmaşık desenleri yakalayan ve betikler içinde onlarca sunucuyu tek komutla güncelleyen bir otomasyon aracına kadar geniş bir yelpazede iş görür. Öğrenmenin en iyi yolu, önce -i olmadan güvenle denemek, çıktıyı görmek ve emin olunca uygulamaktır.

    Bu tür işlemleri rahatça yapabileceğiniz, tam yönetici (root) erişimli bir ortama ihtiyacınız varsa Clou.TR'nin sanal sunucu ve VDS çözümlerine göz atabilir; sunucunuzun bakımını ve yapılandırmasını uzman ekibimize bırakmak isterseniz sunucu yönetimi hizmetimizden yararlanabilirsiniz. WordPress ve web siteleri için hazır, optimize edilmiş bir altyapı arıyorsanız hosting paketlerimiz da hızlı bir başlangıç için sizi bekliyor. Doğru araçlar ve doğru altyapı bir araya geldiğinde, sunucu yönetimi zahmetli bir iş olmaktan çıkıp keyifli bir rutine dönüşür.

    sedMetinLinux

    Uygulamaya geçmeye hazır mısınız?

    NVMe SSD, ücretsiz SSL ve %99.9 uptime garantisiyle Clou.TR hosting ve sunucu çözümleriyle projenizi hayata geçirin.