sed komutu: Metin değiştirme, satır silme ve -i seçeneğinin kullanımı
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/blogSatı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/blogDosya 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_USERdefine( '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.phpdefine( '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.phpdefine( '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.phpdefine( '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.phpdefine( '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.php32sed -n '$=' wp-config.php102Adres 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.phpdefine( '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 WordPressSatı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.
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.confserver {
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.confserver {
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.phpsed -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.bakDü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.php23c23
< 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.phpgrep -n -e DB_USER -e DB_PASSWORD wp-config.php26: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.phpls 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.php207618887 wp-config.phpsed -i 's/localhost/127.0.0.1/' wp-config.phpls -i wp-config.php207618883 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.phpsed: can't read no-such.php: No such file or directorysed -i 's/x/y/'sed: no input files5️⃣ 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.orgNoktayı 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.orgParantezle 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.confsed: -e expression #1, char 46: invalid reference \1 on `s' command's RHSsed -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çenek | Görev | Bu yazıdaki sonuç | |
|---|---|---|---|
| -n | Otomatik çıktıyı kapatır, yalnızca p ile seçilen satırları yazdırır | sed -n '23p' yalnızca 23. satırı gösterir; -n olmadan 2p, 2. satırı iki kez yazdırır | |
| -i | Sonucu 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 | |
| -e | Birden çok betiği bağlayıp tek seferde çalıştırır | DB_USER ve DB_PASSWORD tek seferde değişir; -ie olarak bitişik yazılırsa wp-config.phpe yedeği oluşur | |
| -E | Geniş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üzenler | Olmazsa 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çenek | Görev | |
|---|---|---|
| -f | Betiği dosyadan okuyup çalıştırır | |
| -r | -E ile aynı genişletilmiş düzenli ifadeler (taşınabilirlik için -E) | |
| -s | Birden çok dosyayı tek akış yerine dosya dosya ayrı işler | |
| -z | Satırları satır sonu yerine null karakteriyle ayırır | |
| -u | Girdiyi daha küçük parçalarla okur, çıktıyı daha sık gönderir | |
| --posix | Tü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.
🔢 SSS & önerilen içerikler







ℹ️ 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.