Mastering sed Command in Linux: A Comprehensive Guide (Linux’ta sed Komutunda Uzmanlaşmak: Kapsamlı Bir Rehber)
Linux ve Unix benzeri işletim sistemlerinde metin işleme, sistem yöneticileri ve geliştiriciler için temel bir beceridir. Bu alandaki en güçlü ve çok yönlü araçlardan biri de sed (Stream Editor) komutudur. sed, dosyalar veya standart giriş akışı üzerindeki metinleri satır satır düzenlemek, filtrelemek ve dönüştürmek için tasarlanmıştır. Etkileşimli olmayan bir metin düzenleyici olması, onu kabuk betikleri içinde otomatikleştirilmiş görevler için ideal kılar. Bu kapsamlı rehberde, sed‘in temellerinden gelişmiş kullanımına kadar her şeyi adım adım öğrenecek, pratik örneklerle bilginizi pekiştireceksiniz.
sed’in Temelleri: Nasıl Çalışır?
sed, bir metin akışını (stream) düzenleyen bir programdır. Genellikle bir dosyadan veya boru hattından (pipe) giriş alır ve işlenmiş çıktıyı standart çıktıya (stdout) gönderir. Temel çalışma prensibi oldukça basittir:
sed, giriş akışından her satırı tek tek okur.- Okunan her satırı “pattern space” (kalıp alanı) adı verilen geçici bir arabelleğe yerleştirir.
- Kullanıcı tarafından belirtilen
sedkomutlarını bu satır üzerinde çalıştırır. - Değiştirilmiş satırı (veya orijinalini, eğer değişiklik yapılmadıysa) standart çıktıya yazar.
- Bir sonraki satıra geçerek bu döngüyü tekrarlar.
Bu satır bazında işlem, sed‘in büyük dosyaları bile belleğe yüklemeden verimli bir şekilde işlemesini sağlar.
Temel Sözdizimi ve Seçenekler
sed komutunun genel sözdizimi şöyledir:
sed [SEÇENEKLER]... {KOMUTLAR} [DOSYA...]
Yaygın olarak kullanılan bazı seçenekler:
-n(--quiet,--silent): Varsayılan olarak her satırı yazdırma davranışını engeller. Bu seçenekle birlikte, yalnızca açıkça belirtilenp(print) komutuyla eşleşen satırlar yazdırılır. Bu, belirli satırları filtrelemek için çok kullanışlıdır.-e komut(--expression=komut): Çalıştırılacak birsedkomutu ekler. Birden fazla komut belirtmek için birden fazla-ekullanılabilir.-f dosya(--file=dosya): Komutları bir dosyadan okur. Karmaşık veya çok satırlısedbetikleri için idealdir.-i[ek](--in-place[=ek]): Düzenlemeleri doğrudan orijinal dosyaya yazar. İsteğe bağlıekbelirtilirse, orijinal dosyanın bu eke sahip bir yedeği oluşturulur (örn:-i.bak). Bu seçeneği dikkatli kullanmak önemlidir, çünkü yanlış bir komut verilerinizin kaybolmasına neden olabilir.-r(--regexp-extended): Genişletilmiş düzenli ifadeleri (ERE) kullanır. Bu, parantez()ve artı+gibi karakterleri kaçış karakteri olmadan kullanmanızı sağlar.
sed Komutları ve Kullanım Örnekleri
sed‘in gücü, çeşitli komutlarında ve bunları adreslerle (satır numaraları veya düzenli ifadeler) birleştirme yeteneğinde yatar.
1. Yerine Koyma (Substitution – s)
sed‘in en sık kullanılan komutudur. Bir desenin başka bir metinle değiştirilmesini sağlar.
s/desen/yerine_gecen_metin/bayraklar
desen: Değiştirilecek düzenli ifade.yerine_gecen_metin: Desenle eşleşen yerlere konulacak metin.bayraklar: İşlemi değiştiren isteğe bağlı bayraklar.
Yaygın Bayraklar:
g(global): Satırdaki tüm eşleşmeleri değiştirir, sadece ilkini değil.i(case-insensitive): Büyük/küçük harf duyarlılığını kapatır.p(print): Değişiklik yapılan satırı yazdırır (genellikle-nile kullanılır).w dosya(write): Değişiklik yapılan satırı belirtilen dosyaya yazar.- Sayı (örn:
2): Sadece desenin N’inci eşleşmesini değiştirir.
Örnekler:
# "elma" kelimesini "armut" ile değiştir (ilk eşleşme)
echo "Bu bir elma ve elma suyu." | sed 's/elma/armut/'
Çıktı: Bu bir armut ve elma suyu.
"elma" kelimesini "armut" ile değiştir (tüm eşleşmeler)
echo "Bu bir elma ve elma suyu." | sed 's/elma/armut/g'
Çıktı: Bu bir armut ve armut suyu.
Büyük/küçük harf duyarsız değiştirme
echo "Elma suyu" | sed 's/elma/armut/gi'
Çıktı: Armut suyu
Belirli bir satırda değişiklik yapma (örneğin 3. satır)
sed '3s/eski/yeni/g' dosya.txt
Dosya içinde doğrudan değişiklik yapma ve yedek oluşturma
sed -i.bak 's/eski_metin/yeni_metin/g' dosya.txt
Eşleşen deseni " & " ile kullanma
echo "Merhaba Dünya" | sed 's/Dünya/Büyük &/'
Çıktı: Merhaba Büyük Dünya
2. Satır Silme (Delete – d)
Belirtilen adreslere uyan satırları siler.
[adres]d
Örnekler:
# 5. satırı sil
sed '5d' dosya.txt
1 ile 3 arasındaki satırları sil
sed '1,3d' dosya.txt
"hata" kelimesini içeren satırları sil
sed '/hata/d' dosya.txt
Boş satırları sil
sed '/^$/d' dosya.txt
3. Satır Yazdırma (Print – p)
Belirtilen adreslere uyan satırları yazdırır. Genellikle -n seçeneğiyle birlikte kullanılır.
[adres]p
Örnekler:
# 10. satırı yazdır
sed -n '10p' dosya.txt
"başlık" kelimesini içeren satırları yazdır
sed -n '/başlık/p' dosya.txt
5 ile 10 arasındaki satırları yazdır
sed -n '5,10p' dosya.txt
Belirli bir desenden başlayıp başka bir desene kadar olan satırları yazdır
sed -n '/START/,/END/p' dosya.txt
4. Ekleme, Sonuna Ekleme ve Değiştirme (Insert i, Append a, Change c)
Bu komutlar, metin eklemek veya satırları tamamen değiştirmek için kullanılır.
i metin: Belirtilen adresin öncesine metin ekler.a metin: Belirtilen adresin sonrasına metin ekler.c metin: Belirtilen adresi tamamen metin ile değiştirir.
Çok satırlı metin eklemek için her yeni satırı ters eğik çizgi \ ile bitirmek gerekir.
Örnekler:
# 2. satırın önüne yeni bir satır ekle
echo -e "Satır1\nSatır2\nSatır3" | sed '2i\Yeni Satır Öncesi'
Çıktı:
Satır1
Yeni Satır Öncesi
Satır2
Satır3
"Satır2" içeren satırın sonrasına ekle
echo -e "Satır1\nSatır2\nSatır3" | sed '/Satır2/a\Yeni Satır Sonrası'
Çıktı:
Satır1
Satır2
Yeni Satır Sonrası
Satır3
2. satırı tamamen değiştir
echo -e "Satır1\nSatır2\nSatır3" | sed '2c\Tamamen Değişti'
Çıktı:
Satır1
Tamamen Değişti
Satır3
Çok satırlı ekleme
echo "Başlangıç" | sed 'a\İlk satır\nİkinci satır\nÜçüncü satır'
Çıktı:
Başlangıç
İlk satır
İkinci satır
Üçüncü satır
5. Adres Aralıkları
Komutları belirli satır numaralarına veya desen aralıklarına uygulamak için adres aralıkları kullanılır.
# 5 ile 10. satırlar arasındaki "eski" kelimesini "yeni" ile değiştir
sed '5,10s/eski/yeni/g' dosya.txt
"/START/" ile başlayan ve "/END/" ile biten satırlar arasındaki satırları sil
sed '/START/,/END/d' dosya.txt
İlk boş satırdan son boş satıra kadar olan kısmı sil (çok satırlı boşluk blokları)
sed '/^$/,/^$/d' dosya.txt
Gelişmiş sed Teknikleri ve Pratik İpuçları
Çoklu Komutlar
Tek bir sed çağrısında birden fazla komut çalıştırabilirsiniz:
-eseçeneğini birden fazla kullanmak:sed -e 's/foo/bar/' -e 's/baz/qux/' dosya.txt- Noktalı virgül
;kullanmak:sed 's/foo/bar/; s/baz/qux/' dosya.txt - Komut dosyasını bir dosyadan okumak (
-f):
# komutlar.sed dosyası içeriği:
s/foo/bar/g
/hata/d
sed -f komutlar.sed dosya.txt
Düzenli İfadeler (Regular Expressions)
sed‘in gücünün büyük bir kısmı düzenli ifadeleri kullanma yeteneğinden gelir. Genişletilmiş düzenli ifadeler (ERE) için -r (veya -E) seçeneğini kullanmak, sözdizimini basitleştirir:
# Parantez () ile yakalama grupları ve \1 ile geri referanslama
echo "Ad: John Doe" | sed -r 's/Ad: (.) (.)/\2, \1/'
Çıktı: Doe, John
Satır başı ^ ve satır sonu $
echo "Merhaba" | sed 's/^/>>> /' # Satır başına ekle
echo "Merhaba" | sed 's/$/ <<<' # Satır sonuna ekle
Karakter sınıfları []
echo "renk" | sed 's/[aeiou]/X/g' # Tüm sesli harfleri X ile değiştir
Çıktı: rXnXk
Hold Space (Bekletme Alanı)
sed, “pattern space” (kalıp alanı) dışında, metinleri geçici olarak depolamak için “hold space” (bekletme alanı) adı verilen ikinci bir arabelleğe sahiptir. Bu, çok satırlı işlemleri veya karmaşık metin manipülasyonlarını gerçekleştirmek için çok güçlü bir özelliktir. Temel komutlar:
h: Pattern space içeriğini hold space’e kopyalar.H: Pattern space içeriğini hold space’e ekler.g: Hold space içeriğini pattern space’e kopyalar.G: Hold space içeriğini pattern space’e ekler.x: Pattern space ve hold space içeriklerini değiştirir.
Örneğin, iki satırı değiştirmek veya belirli bir kalıbın ardından gelen satırı işlemek için kullanılabilir.
Pratik Senaryolar
- Boş satırları kaldırma:
sed '/^$/d' dosya.txt - Belirli bir kalıbı içeren satırları yorum satırı yapma:
sed '/hata/s/^/# /' dosya.txt - HTML etiketlerini kaldırma:
sed 's/<[^>]*>//g' dosya.html - Belirli bir sütunu çıkarma (boşlukla ayrılmış):
sed -r 's/^(\S+\s+){2}//' dosya.txt(ilk iki sütunu siler) - Birden fazla dosyada düzenleme:
sed -i 's/eski/yeni/g' *.txt
Sonuç ve Sıkça Sorulan Sorular
sed, basit metin değiştirmelerden karmaşık veri dönüşümlerine kadar geniş bir yelpazede görevleri yerine getirebilen inanılmaz derecede güçlü bir araçtır. Düzenli ifadelerle birleştiğinde, metin işleme yeteneklerinizde devrim yaratabilir. Başlangıçta biraz dik bir öğrenme eğrisine sahip olsa da, pratik yaparak ve bolca örnek inceleyerek bu araca hakim olabilirsiniz. Komutları bir dosyaya doğrudan uygulamadan önce her zaman çıktıyı standart çıktıya yönlendirerek test etmeyi unutmayın (-i seçeneğini kullanmadan).
Sıkça Sorulan Sorular (SSS)
1. sed ve awk arasındaki fark nedir?
sed, satır bazında düzenlemeler ve filtrelemeler için tasarlanmış bir “stream editor”dür. Temel olarak metin akışını manipüle eder. awk ise daha çok bir programlama diline benzer; sütun bazında işleme, karmaşık veri analizi, değişkenler, koşullu ifadeler ve döngüler gibi özellikler sunar. sed daha çok “ne değiştirilecek” sorusuna odaklanırken, awk “verilerle ne yapılacak” sorusuna daha geniş bir cevap verir.
2. Neden -n ve p komutunu birlikte kullanıyoruz?
sed varsayılan olarak her satırı işledikten sonra standart çıktıya yazdırır. -n seçeneği bu varsayılan yazdırma davranışını engeller. Bu durumda, sadece açıkça p (print) komutuyla belirtilen satırlar yazdırılır. Bu kombinasyon, özellikle belirli satırları filtrelemek veya ayıklamak istediğinizde çok kullanışlıdır, çünkü sadece ilgilendiğiniz çıktıları görmenizi sağlar.
3. sed ile dosya içinde değişiklik yapmak güvenli midir?
-i seçeneği ile dosya içinde doğrudan değişiklik yapmak mümkündür. Ancak, bu işlem geri alınamaz olduğundan dikkatli kullanılmalıdır. Yanlış bir komut dosyanızdaki verileri kalıcı olarak bozabilir. Güvenli bir yaklaşım, -i seçeneğine bir yedekleme eki sağlamaktır (örn: sed -i.bak 's/eski/yeni/' dosya.txt). Bu, orijinal dosyanın dosya.txt.bak adında bir kopyasını oluşturur, böylece bir sorun olması durumunda geri dönebilirsiniz.
4. sed komutunda regex kullanırken özel karakterlerden nasıl kaçınırım?
Düzenli ifadelerde özel anlamı olan karakterler (örn: ., *, +, ?, ^, $, [, ], (, ), {, }, |, \, /) literal olarak eşleşmesini istiyorsanız, önlerine bir ters eğik çizgi \ koyarak kaçmanız gerekir. Örneğin, bir noktayı . değil, \. olarak aramalısınız. Eğer aradığınız desen içinde çok fazla özel karakter varsa, sed‘in s/// komutunda farklı bir sınırlayıcı kullanmak (örn: s#desen#yerine_gecen_metin#) da pratik olabilir.
5. sed ile çok satırlı işlemleri nasıl yaparım?
sed temel olarak satır bazında çalışsa da, “hold space” (bekletme alanı) ve döngü komutları (N, P, D) ile çok satırlı işlemler gerçekleştirmek mümkündür. N komutu bir sonraki satırı pattern space’e okur ve mevcut satırla birleştirir, böylece iki satırı aynı anda işleyebilirsiniz. Hold space ise geçici olarak metin depolayarak daha karmaşık mantıklar kurmanıza olanak tanır. Ancak, çok satırlı karmaşık işlemler için awk genellikle daha uygun bir araçtır.