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:
| Bayrak | Anlamı | Örnek |
|---|---|---|
g | Satırdaki tüm eşleşmeleri değiştir | s/a/b/g |
i | Büyük/küçük harf duyarsız eşleştir | s/error/HATA/gi |
2 | Satırdaki yalnızca 2. eşleşmeyi değiştir | s/,/;/2 |
p | Değişen satırı yazdır (-n ile) | sed -n 's/x/y/p' |
w dosya | Değişen satırları belirtilen dosyaya yaz | s/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:
| Komut | Ne yapar | Kullanım |
|---|---|---|
a\ | Eşleşen satırdan sonra ekler | Yeni ayar satırı iliştirmek |
i\ | Eşleşen satırdan önce ekler | Başlık/yorum satırı koymak |
c\ | Eşleşen satırı komple değiştirir | Bir satırı tümden yenilemek |
d | Eşleşen satırı siler | Gereksiz/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:
| Sembol | Anlamı |
|---|---|
^ | 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.