sed komutu: Metin değiştirme, satır silme ve -i seçeneğinin kullanımı

Test ortamıRHEL ailesiAlmaLinux 9.8root hesabı2026-10-28 tarihinde kontrol edildi

sed komutu, dosyayı satır satır okuyup değiştirme, silme ve ekleme işlemlerini çalıştıran bir Linux aracıdır; böylece düzenleyici açmadan yapılandırma dosyasındaki değerleri değiştirebilirsiniz. AlmaLinux 9 sunucusunda WordPress wp-config.php dosyasının bir kopyasında sed çalıştırdığımızda, -i.bak ile özgün dosyayı koruyarak veritabanı adını değiştirebildik.

Yazıdaki hata mesajları, İngilizce locale altında yazdırıldığı gibidir.

1️⃣ sed komutunun temel kullanımı ve s ile değiştirme

En çok kullanılan s komutu, metni [s/aranacak metin/yeni metin/] biçiminde değiştirir. Bir satırda yalnızca ilk bulunan eşleşmeyi değiştirir.

echo 'http://example.com http://example.com/blog' | sed 's/http:/https:/'
https://example.com http://example.com/blog

Satırdaki tüm eşleşmeleri değiştirmek için sona g bayrağını eklersiniz.

echo 'http://example.com http://example.com/blog' | sed 's/http:/https:/g'
https://example.com https://example.com/blog

Dosya adını sona eklerseniz sed o dosyayı okur ve değiştirilmiş sonucu yazdırır. WordPress wp-config-sample.php dosyasının wp-config.php adıyla alınmış kopyasında DB_USER değerini değiştirdik ve yalnızca o satırı grep ile kontrol ettik.

sed 's/username_here/wp_user/' wp-config.php | grep DB_USER
define( 'DB_USER', 'wp_user' );

Çıktıda değer değiştiği için dosyanın da değiştiğini sanmak kolaydır, ancak sed seçeneksiz çalıştırıldığında sonucu yalnızca ekrana yazdırır ve özgün dosyaya dokunmaz. Aynı satırı dosyada yeniden aradığımızda ilk değer hâlâ duruyordu.

grep DB_USER wp-config.php
define( 'DB_USER', 'username_here' );

Özgün dosyayı da değiştirmek için 4️⃣ bölümündeki -i seçeneğini kullanırsınız.

2️⃣ sed ile satır numarası ve desene göre satır seçme (-n, p)

s komutu adres olmadan çalıştırılınca tüm satırlara uygulanır; bu nedenle belirli satırlarla çalışmak için komutun önüne adres olarak satır numarası veya desen yazarsınız. -n otomatik çıktıyı kapatır, p seçilen satırları yazdırır. İkisi birlikte kullanılınca yalnızca 23. satır çıkar.

sed -n '23p' wp-config.php
define( 'DB_NAME', 'database_name_here' );

İki satır numarasını virgülle bağlarsanız o aralık çıkar. 23. satırdan 32. satıra kadarki bölüm, veritabanı adı, kullanıcı, parola ve ana makine ayarlarının bulunduğu kısımdır.

sed -n '23,32p' wp-config.php
define( 'DB_NAME', 'database_name_here' );

/** Database username */
define( 'DB_USER', 'username_here' );

/** Database password */
define( 'DB_PASSWORD', 'password_here' );

/** Database hostname */
define( 'DB_HOST', 'localhost' );

Satır numarası yerine eğik çizgiler arasına desen yazarsanız o deseni içeren tüm satırlar seçilir.

sed -n '/DB_/p' wp-config.php
define( 'DB_NAME', 'database_name_here' );
define( 'DB_USER', 'username_here' );
define( 'DB_PASSWORD', 'password_here' );
define( 'DB_HOST', 'localhost' );
define( 'DB_CHARSET', 'utf8mb4' );
define( 'DB_COLLATE', '' );

[=] komutu seçilen satırın numarasını yazdırır. $ adresi son satır anlamına gelir, bu yüzden [$=] ile dosyanın toplam satır sayısını görebilirsiniz.

sed -n '/DB_HOST/=' wp-config.php
32
sed -n '$=' wp-config.php
102

Adres s komutunun önüne de yazılabilir. Aşağıda localhost değerinin yalnızca 32. satırda değiştirildiği ve p bayrağıyla yalnızca değişen satırın yazdırıldığı sonuç var.

sed -n '32s/localhost/127.0.0.1/p' wp-config.php
define( 'DB_HOST', '127.0.0.1' );

p komutunu -n olmadan çalıştırdığımızda seçilen satır bir kez daha çıktı. sed satırları tek tek desen alanına okur, komutları çalıştırır, ardından desen alanını otomatik yazdırır; bu yüzden p ile yazdırılan 2. satır otomatik çıktıyla yeniden görünür.

sed '2p' wp-config.php | head -n 4
<?php
/**
/**
 * The base configuration for WordPress

Satırları tek tek okuyup işleyen bu yöntem, fabrikadaki taşıyıcı bandın parçaları tek tek tezgâha koyup işledikten sonra sıradaki parçaya geçmesine benzer.

Her komutun satır başına ne yazdırdığını aşağıdaki diyagramda adım adım karşılaştırabilirsiniz.

🧭 sed desen alanı ve otomatik çıktı: 2. satırda p, d
Açıklama diyagramı
⚙️ Komut
$ sed '2p'-n '2p''2d' wp-config.php
Okunan satırKomutun çalışması ve çıktı
1. satır → desen alanı<?php
➜
Adres 2 ile farklı: komut yokOtomatik çıktı 1 kez-n nedeniyle çıktı yok
2. satır → desen alanı/**
➜
Adres 2 ile aynı: p çalışırAdres 2 ile aynı: d çalışırp ile 1 kez + otomatik 1 kezYalnızca p ile 1 kezDesen alanını siler, sonraki satıra geçer
3. satır → desen alanı * The base configuration for WordPress
➜
Adres 2 ile farklı: komut yokOtomatik çıktı 1 kez-n nedeniyle çıktı yok
🖥️ Ekranda görünenler (1~3. satırlar)
<?php/**/** * The base configuration for WordPress
p desen alanını bir kez daha yazdırır, bu yüzden -n olmadan 2. satır iki kez çıkar.
-n otomatik çıktıyı kapatır, bu yüzden yalnızca p ile seçilen 2. satır bir kez çıkar.
d desen alanını silip sonraki satıra geçer, bu yüzden 2. satır otomatik yazdırılmaz.

3️⃣ sed komutuyla satır silme ve ekleme (d, i, a)

d seçilen satırları siler. Aşağıdaki nginx örnek yapılandırmasını yorum satırları olmadan görmek için # ile başlayan veya # önünde yalnızca boşluk bulunan satırları [^ *#] deseniyle seçersiniz.

cat example.conf
# example.com
server {
    listen 80;
    server_name example.com www.example.com;

    # document root
    root /var/www/example.com;
    index index.php index.html;

    location / {
        try_files $uri $uri/ /index.php?$args;
    }
}
sed '/^ *#/d' example.conf
server {
    listen 80;
    server_name example.com www.example.com;

    root /var/www/example.com;
    index index.php index.html;

    location / {
        try_files $uri $uri/ /index.php?$args;
    }
}

Komutları noktalı virgülle bağlarsanız boş satır anlamına gelen [^$] de silinir. Yorumlar silindikten sonra kalan iki boş satır kayboldu ve yalnızca yapılandırma satırları kaldı.

sed '/^ *#/d; /^$/d' example.conf
server {
    listen 80;
    server_name example.com www.example.com;
    root /var/www/example.com;
    index index.php index.html;
    location / {
        try_files $uri $uri/ /index.php?$args;
    }
}

i seçilen satırın önüne, a arkasına metin ekler. 1. satırın önüne bir yorum satırı eklenince çıkan sonuç aşağıdadır.

sed '1i # managed by sed' example.conf | head -n 3
# managed by sed
# example.com
server {

a komutundan sonra girintili metin yazınca girintinin de ekleneceğini sanmak kolaydır, ancak GNU sed a komutundan hemen sonraki boşlukları atlayıp yalnızca metni ekler.

sed '/index index.php/a    client_max_body_size 64M;' example.conf
# example.com
server {
    listen 80;
    server_name example.com www.example.com;

    # document root
    root /var/www/example.com;
    index index.php index.html;
client_max_body_size 64M;

    location / {
        try_files $uri $uri/ /index.php?$args;
    }
}

Girintiyi korumak için a komutundan sonra ters eğik çizgi koyarsınız. Ters eğik çizgiden sonraki boşluktan itibaren her şey metin olarak girer.

sed '/index index.php/a\    client_max_body_size 64M;' example.conf
# example.com
server {
    listen 80;
    server_name example.com www.example.com;

    # document root
    root /var/www/example.com;
    index index.php index.html;
    client_max_body_size 64M;

    location / {
        try_files $uri $uri/ /index.php?$args;
    }
}

c seçilen satırı tamamen değiştirir. Aşağıda listen 80 satırının 8080 yapıldığı sonucun ilk dört satırı var.

sed '/listen 80;/c\    listen 8080;' example.conf | head -n 4
# example.com
server {
    listen 8080;
    server_name example.com www.example.com;

4️⃣ sed -i ile dosyayı doğrudan değiştirme ve yedek dosya adı

-i sonucu ekran yerine özgün dosyaya kaydeder. -i komutunun hemen arkasına yazılan metin, yedek dosya adının sonuna eklenir. wp-config.php gibi sitenin okuduğu dosyalarda -i.bak ile özgün dosyayı saklayarak düzenleme yaparsınız.

cp wp-config-sample.php wp-config.php
sed -i.bak 's/database_name_here/wordpress_db/' wp-config.php

-i ile çalıştırınca ekrana hiçbir şey yazdırılmaz, bu yüzden dosyaları ls -l ile kontrol edersiniz.

ls -l wp-config.php*
-rw-r--r-- 1 root root 3333 Oct 28 15:13 wp-config.php
-rw-r--r-- 1 root root 3339 Oct 28 15:13 wp-config.php.bak

Düzenlenen dosya ile .bak dosyası yan yana oluştu. database_name_here, wordpress_db olarak kısaldığı için boyut 6 bayt azaldı. İki dosyayı diff ile karşılaştırırsanız yalnızca değişen satırı görürsünüz.

diff wp-config.php.bak wp-config.php
23c23
< define( 'DB_NAME', 'database_name_here' );
---
> define( 'DB_NAME', 'wordpress_db' );

Değişen satır, 23. satırdaki tek DB_NAME satırıdır.

Değiştirilecek birden çok değer varsa betikleri -e ile bağlayıp tek seferde çalıştırırsınız.

sed -i -e 's/username_here/wp_user/' -e 's/password_here/wp_pass/' wp-config.php
grep -n -e DB_USER -e DB_PASSWORD wp-config.php
26:define( 'DB_USER', 'wp_user' );
29:define( 'DB_PASSWORD', 'wp_pass' );

-i ve -e seçeneklerini [-ie] gibi bitişik yazarsanız e de yedek adının parçası olarak okunur ve aşağıdaki gibi wp-config.phpe dosyası oluştu.

sed -ie 's/127.0.0.1/localhost/' wp-config.php
ls wp-config.php*
wp-config.php
wp-config.php.bak
wp-config.phpe

-i düzenlenen içeriği yeni bir dosyaya yazıp özgün adla değiştirdiği için çalıştırma öncesi ve sonrası dosyanın inode numarası farklıdır.

ls -i wp-config.php
207618887 wp-config.php
sed -i 's/localhost/127.0.0.1/' wp-config.php
ls -i wp-config.php
207618883 wp-config.php

Çalıştırmadan önce 207618887 olan inode numarası 207618883 oldu.

Dosya yoksa veya dosya adı unutulduysa sed aşağıdaki hatayla biter ve hiçbir dosya değişmez.

sed -i 's/x/y/' no-such.php
sed: can't read no-such.php: No such file or directory
sed -i 's/x/y/'
sed: no input files

5️⃣ sed düzenli ifadeleri, ayırıcı değiştirme ve seçenekler

🔲 Düzenli ifadeler ve ayırıcı değiştirme

Yol gibi eğik çizgi içeren bir değeri değiştirirseniz s komutunun ayırıcısı ile değerdeki eğik çizgiler karışır, bu yüzden değerdeki her eğik çizgiye ters eğik çizgi eklemeniz gerekir.

sed -n 's/\/var\/www\/example.com/\/srv\/www\/example.com/p' example.conf
    root /srv/www/example.com;

s komutundan hemen sonraki karakter ayırıcı olur, bu yüzden değerde bulunmayan | karakterine geçerseniz ters eğik çizgi olmadan aynı sonucu alırsınız.

sed -n 's|/var/www/example.com|/srv/www/example.com|p' example.conf
    root /srv/www/example.com;

Desendeki nokta (.) herhangi bir tek karakterle eşleşir. Aşağıda example.com arayan desenin exampleXcom değerini de değiştirdiği sonuç var.

echo 'exampleXcom example.com' | sed 's/example.com/test.org/g'
test.org test.org

Noktayı karakter olarak aramak için önüne ters eğik çizgi koyarsınız.

echo 'exampleXcom example.com' | sed 's/example\.com/test.org/g'
exampleXcom test.org

Parantezle gruplanan kısım, yeni metinde [\1] ile geri çağrılır. -E eklenirse parantez ve + ters eğik çizgisiz kullanılır. Aşağıda listen sonrasındaki sayının korunup default_server eklendiği sonuç var.

sed -nE 's/listen ([0-9]+);/listen \1 default_server;/p' example.conf
    listen 80 default_server;

Aynı betik -E olmadan çalıştırılırsa parantezler metin olarak okunur ve geri çağrılacak grup olmadığını bildiren bir hata çıkar. -E olmadan kullanmak için parantezlere ve + karakterine ters eğik çizgi eklersiniz.

sed -n 's/listen ([0-9]+);/listen \1 default_server;/p' example.conf
sed: -e expression #1, char 46: invalid reference \1 on `s' command's RHS
sed -n 's/listen \([0-9]\+\);/listen \1 default_server;/p' example.conf
    listen 80 default_server;

Yeni metindeki [&], desenle eşleşen metnin tamamı anlamına gelir; böylece eşleşen kısmın önüne # ekleyip o satırı yorum yapabilirsiniz.

sed -n 's/server_name .*;/# &/p' example.conf
    # server_name example.com www.example.com;

🔲 sed komutu seçenekleri

📌 Başlıca seçenekler: bu yazıda çalıştırılan sonuçlar

SeçenekGörevBu yazıdaki sonuç
-nOtomatik çıktıyı kapatır, yalnızca p ile seçilen satırları yazdırırsed -n '23p' yalnızca 23. satırı gösterir; -n olmadan 2p, 2. satırı iki kez yazdırır
-iSonucu ekran yerine özgün dosyaya kaydeder (hemen arkasındaki metin yedek adının sonuna eklenir)-i.bak ile wp-config.php.bak oluşur; çalıştırmadan sonra inode numarası değişir
-eBirden çok betiği bağlayıp tek seferde çalıştırırDB_USER ve DB_PASSWORD tek seferde değişir; -ie olarak bitişik yazılırsa wp-config.phpe yedeği oluşur
-EGenişletilmiş düzenli ifadeleri kullanır (parantez ve + için ters eğik çizgi gerekmez)listen 80 default_server; yazdırır; -E olmadan aynı betik [invalid reference] hatası verir
--follow-symlinks-i ile birlikte bağlantının gösterdiği özgün dosyayı düzenlerOlmazsa bağlantının yerine normal dosya oluşur ve özgün dosya aynı kalır; eklenirse özgün değer değişir

📎 Diğer seçenekler: resmî kılavuza göre

SeçenekGörev
-fBetiği dosyadan okuyup çalıştırır
-r-E ile aynı genişletilmiş düzenli ifadeler (taşınabilirlik için -E)
-sBirden çok dosyayı tek akış yerine dosya dosya ayrı işler
-zSatırları satır sonu yerine null karakteriyle ayırır
-uGirdiyi daha küçük parçalarla okur, çıktıyı daha sık gönderir
--posixTüm GNU uzantılarını kapatır
--debugÇalışma sürecini ayrıntılı yazdırır

🔲 sed komutu simülatörü

Aşağıdaki simülatörün çalışma klasöründe wp-config.php kopyası ve example.conf bulunur. Şimdiye kadarki komutları kendiniz yazabilir, -i ile değişen dosyaları ls -l ve diff ile kontrol edebilirsiniz.

sed komutu simülatörüGNU sed
[root@server work]#
Klavyedeki ↑↓ tuşlarıyla daha önce yazdığınız komutları geri çağırabilirsiniz.

🔢 SSS & önerilen içerikler

WordPress wp-config-sample.php dosyasının satır sonları CRLF olduğundan satır sonunun hemen önünde görünmeyen bir [\r] bulunur. [/false );$/] hiçbir satır yazdırmadı, [s/\r$//] ile [\r] silinen kopyada ise aynı desen WP_DEBUG satırını buldu.

-i bağlantının yerine yeni bir normal dosya oluşturup oraya kaydettiği için bağlantının gösterdiği özgün dosya değişmedi. Özgün dosyayı düzenlemek için [--follow-symlinks] seçeneğini de belirtirsiniz. Bu durumda bağlantı olduğu gibi kaldı ve özgün değer değişti.

NEW=wp_user ile atanan değişken de tek tırnak içinde yazılırsa kabuk onu açmaz ve [$NEW] olduğu gibi girer. Betik çift tırnakla sarıldığında kabuk önce değişkeni açtı ve [$NEW] yerine wp_user girdi.

🧭 Metin komutları için önerilen içerikler 9 yazı · 2 kaynak
🗂️ Metin görüntüleme · düzenleme komutları
📄 grep komutu 📄 sort komutu 📄 uniq komutu 📄 tee komutu 📄 sed komutu
📄 cat komutu 📄 less komutu 📄 head · tail komutları 📄 vi · vim komutları

ℹ️ Satış ortaklığı bildirimi
Bu sitenin içeriklerinde satış ortaklığı bağlantıları bulunur. Bir ziyaretçi bu bağlantılar üzerinden ürün veya hizmet satın alırsa bu site satıcıdan komisyon alır. Bu süreçte alıcının ödediği tutar (kampanya indirimlerinde tutar düşer↓) artmaz. Yayımlanan fiyat, indirim ve stok bilgileri yazının yazıldığı zamana aittir ve gerçek durumdan farklı olabilir; bu yüzden satın almadan önce son bilgiyi satıcıdan kontrol etmenizi rica ederiz. Ürünler kendi ölçütlerimize göre seçilir ve değerlendirilir; komisyon alınıp alınmaması tanıtım sırasını veya değerlendirme içeriğini etkilemez.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

İnsan olduğunuzu kanıtlayın: 5   +   1   =