Takip et

Mastering sed Command in Linux: A Comprehensive Guide (Linux’ta sed Komutunda Uzmanlaşmak: Kapsamlı Bir Rehber)

Mastering sed Command in Linux: A Comprehensive Guide (Linux’ta sed Komutunda Uzmanlaşmak: Kapsamlı Bir Rehber) Linux ve Unix benzeri işletim si

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:

  1. sed, giriş akışından her satırı tek tek okur.
  2. Okunan her satırı “pattern space” (kalıp alanı) adı verilen geçici bir arabelleğe yerleştirir.
  3. Kullanıcı tarafından belirtilen sed komutlarını bu satır üzerinde çalıştırır.
  4. Değiştirilmiş satırı (veya orijinalini, eğer değişiklik yapılmadıysa) standart çıktıya yazar.
  5. 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 belirtilen p (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 bir sed komutu ekler. Birden fazla komut belirtmek için birden fazla -e kullanılabilir.
  • -f dosya (--file=dosya): Komutları bir dosyadan okur. Karmaşık veya çok satırlı sed betikleri için idealdir.
  • -i[ek] (--in-place[=ek]): Düzenlemeleri doğrudan orijinal dosyaya yazar. İsteğe bağlı ek belirtilirse, 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 -n ile 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:

  1. -e seçeneğini birden fazla kullanmak: sed -e 's/foo/bar/' -e 's/baz/qux/' dosya.txt
  2. Noktalı virgül ; kullanmak: sed 's/foo/bar/; s/baz/qux/' dosya.txt
  3. Komut dosyasını bir dosyadan okumak (-f):
  4. # 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.

Yorumlar
İçeriği beğendiniz mi? Bir tartışma başlatın veya görüşlerinizi paylaşın.
Yorum Yaz

Bir yanıt yazın

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

E-posta Bülteni
Yazılım Topluluğuna Katılın
En son güncellemeleri, yaratıcı ipuçlarını ve özel kaynakları doğrudan e-posta kutunuza alın. Tasarım ve inovasyonun geleceğini birlikte keşfedelim.