Sed, “Stream EDitor” anlamına gelir: tüm Linux ve Unix tabanlı işletim sistemlerine varsayılan olarak yüklenen ücretsiz ve açık kaynaklı bir yardımcı programdır. Yaptığı şey, dosyalar üzerinde metin manipülasyonu yapmaktır, ancak aynı zamanda boru hattının bir parçası olarak da kullanılabilir ve düzenli ifadelerin kullanımını destekler. Bu derste sed replacement komutunun temellerini öğreneceğiz.
“Substitute” komutu
Substitute muhtemelen en çok bilinen ve kullanılan sed komutudur: bir dosyadaki metin kalıplarını etkileşimli olmayan bir şekilde değiştirmemize yardımcı olur. Eğer onu nasıl kullanacağımızı öğrenmek istiyorsak yapmamız gereken ilk şey, sözdizimine bir göz atmaktır. Bir örnek görelim: John Ronald Reuel Tolkien’in yazdığı ünlü yüzük şiirini içeren lotr.txt adında bir dosyamız olduğunu varsayalım:
Three Rings for the Elven-kings under the sky, Seven for the Dwarf-lords in their halls of stone, Nine for Mortal Men doomed to die, One for the Dark Lord on his dark throne In the Land of Mordor where the Shadows lie. One Ring to rule them all, One Ring to find them, One Ring to bring them all, and in the darkness bind them, In the Land of Mordor where the Shadows lie.
Şimdi, tam teşekküllü bir metin düzenleyici kullanmadan, belki de bir kabuk komut dosyasından, “Ring” kelimesinin tüm geçişlerini “foo” kelimesiyle değiştirmek istediğimizi hayal edin. Böyle bir eylemi sed kullanarak gerçekleştirmek için şunu çalıştırırız:
$ sed 's/Ring/foo/g' lotr.txt
Komutu başlattığımız anda dosyanın işlenmiş içeriği standart çıktıda görünecektir:
Three foos for the Elven-kings under the sky, Seven for the Dwarf-lords in their halls of stone, Nine for Mortal Men doomed to die, One for the Dark Lord on his dark throne In the Land of Mordor where the Shadows lie. One foo to rule them all, One foo to find them, One foo to bring them all, and in the darkness bind them, In the Land of Mordor where the Shadows lie.
Beklendiği gibi, “Ring” kelimesinin her geçtiği yer “foo” ile değiştirildi; Ancak orijinal dosya değişmeden kaldı: Bunun nedeni, varsayılan olarak sed’in yalnızca standart çıktıya yazmasıdır. Yukarıdaki örnekte ne yaptığımızı analiz edelim. Sed yardımcı programı, tek bir harfle ve bazen de bir tür argümanla temsil edilen bir dizi komutu kabul eder. Bu durumda s komutunu (değiştirme) kullandık. Komutun sözdizimi aşağıdaki gibidir:
s/regexp/replacement/flags
Yardımcı program, belirtilen dosyada (veya akışta) belirtilen normal ifadeyi (“regexp”) eşleştirmeye çalışır; ifadenin her eşleşmesi “değiştirme” ile değiştirilir.
Geri referansları kullanma
Hem normal ifadenin hem de değiştirmenin bir parçası olarak, yakalama grupları oluşturan, kaçışlı parantez içine alınmış eşleşen bir normal ifadenin alt bölümlerine referans vermemize olanak tanıyan geri referansları kullanabiliriz. Bir örnek görelim:
$ sed 's/\([a-z]\)\1\([ ,/]\)/\1\2/g' lotr.txt
Yukarıdaki örnekte aşağıdaki normal ifadeyi belirttik:
\([a-z]\)\1\([ ,.]\)
İlk [az] modeli “a”dan “z”ye kadar herhangi bir ASCII karakteriyle eşleşir; görebileceğiniz gibi, kaçışlı parantez içinde yazılmıştır: bu, eşleşen metne daha sonra \1 kullanarak referans vermemize olanak tanıyan bir yakalama grubu oluşturur; burada “1”, ilk yakalama grubu anlamına gelir.
Hemen ardından “herhangi bir çift karakteri” eşleştirmek için yaptığımız şey buydu. Son olarak, [,.] ifadesini içeren başka bir yakalama grubu tanımladık: bu (alt)ifade bir “boşluk”, bir “virgül” veya bir “nokta” ile eşleşir. Tahmin edebileceğiniz gibi ikinci yakalama grubuna \2 kullanarak referans verebiliriz. Dolayısıyla ifadenin tamamı şu anlama gelir: “boşluk, virgül veya noktanın takip ettiği herhangi bir çift karakter”.
Komutun “değiştirme” bölümünde, tüm eşleşen modeli, ilk yakalama grubunda yer alan ifadeyle eşleşen karakterin tek bir oluşumuyla değiştirmek ve ardından ikinci yakalama grubunda yer alan ifadenin eşleşmesini sağlamak için tekrar geri referansları kullandık. bir (yine: boşluk, virgül veya nokta).
Ayrıca, komutun “değiştirme” kısmından sonra g harfini kullandığımızı da fark edebilirsiniz: bu, yalnızca ilkinin yerine bir satırdaki tüm eşleşmelerin değiştirilmesini sağlayan bir bayraktır (ikincisi varsayılan sed davranışıdır) . Bir sonraki bölümde özellikle bayraklardan bahsedeceğiz. Komutun bir sonucu olarak, bir kelimenin sonundaki herhangi bir çift harf, tek bir oluşumla değiştirilir. Sonuç budur:
Thre Rings for the Elven-kings under the sky, Seven for the Dwarf-lords in their halls of stone, Nine for Mortal Men doomed to die, One for the Dark Lord on his dark throne In the Land of Mordor where the Shadows lie. One Ring to rule them al, One Ring to find them, One Ring to bring them al, and in the darknes bind them, In the Land of Mordor where the Shadows lie.
Komutun “değiştirme” kısmında, normal ifade eşleşmesinin tamamına referans veren, çıkışsız & karakterini de kullanabiliriz.
Sed “substitute” komut parametreleri
S komutunu kullanırken davranışını değiştirebilecek bir dizi parametre belirtebiliriz. Bunlardan bazılarını ve etkilerini görelim.
“g” parametresi
G parametresi, sed “substitute” komutunun davranışını değiştirerek bir regexp’in satırdaki tüm eşleşmelerinin yalnızca ilki yerine değiştirilmesini sağlar. Örnek olarak yüzük şiirinin 6. mısrasına bakalım: “Yüzük” kelimesi iki kez geçiyor. İlk örnekte yaptığımız gibi “substitute” komutunu g parametresi olmadan çalıştıralım:
$ sed 's/Ring/foo/' lotr.txt
Şunu elde ederiz:
One foo to rule them all, One Ring to find them,
Gördüğünüz gibi “Ring” kelimesinin yalnızca ilk geçtiği yer “foo” ile değiştirildi. Bunun yerine g parametresini kullanırsak, her iki durum da değişiklikten etkilenir.
“i” parametresi
i parametresi, s komutunda kullanılan normal ifadenin büyük/küçük harfe duyarlı olmamasına neden olur. Örneğin, aşağıdaki komuttaki normal ifade, “ring” belirtilmiş olsa bile “Ring” ile eşleşecektir:
$ sed 's/ring/foo/i' lotr.txt
Sayıyı parametre olarak kullanma
Bir sayı parametre olarak kullanıldığında, sed s komutunun davranışı değişir, böylece bir satırdaki regex’in yalnızca n eşleşmesi “değiştirme” ile değiştirilir (sed satır bazında çalışır). Eğer çalıştırırsak:
$ sed 's/Ring/foo/1' lotr.txt
Aşağıdaki çıktıyı elde ederiz:
Three foos for the Elven-kings under the sky, Seven for the Dwarf-lords in their halls of stone, Nine for Mortal Men doomed to die, One for the Dark Lord on his dark throne In the Land of Mordor where the Shadows lie. One foo to rule them all, One Ring to find them, One foo to bring them all, and in the darkness bind them, In the Land of Mordor where the Shadows lie.
“p” parametresi
p parametresi sed’in davranışını değiştirir, böylece bir değişikliğin gerçekleştirildiği satırların çıktısını alır. Bu özellikle sed’in -n seçeneğiyle birlikte kullanıldığında kullanışlıdır, bu da sessiz olmasını sağlar. İki şey birleştirildiğinde yalnızca değiştirilen satırlar yazdırılır:
$ sed -n 's/Ring/foo/gp' lotr.txt
Komut şunu döndürür:
Three foos for the Elven-kings under the sky, One foo to rule them all, One foo to find them, One foo to bring them all, and in the darkness bind them,
Yukarıdakiler sed “substitute” komutu ile kullanılabilecek parametreden sadece birkaçıdır; tam ve ayrıntılı listeye “s” komutunun resmi belgeleri okunarak ulaşılabilir.
Metni yerinde değiştirme
Daha önce de söylediğimiz gibi sed “substitute” komutunun çıktısı standart çıktının üzerine yazdırılır, böylece orijinal dosya değişmez. Bir dosyanın içeriğini yerinde değiştirmek istersek, tek yapmamız gereken -i seçeneğiyle (–in-place’in kısaltması) sed’i çağırmak olacaktır, örneğin:
$ sed -i 's/Ring/foo/g' lotr.txt
Seçeneğe argüman olarak bir sonek sağlamak da mümkündür. Bunu yaptığımızda belirttiğimiz sonek ile bir yedekleme dosyası oluşturulur. Örneğin, şunu çalıştırırsak:
$ sed --in-place='.bk' 's/Ring/foo/g' lotr.txt
Yukarıdaki komutu çalıştıracak olsaydık hedef dosya yerinde değiştirilirdi; Ancak orijinal içeriği lotr.txt.bk adlı bir yedekleme dosyasına kaydedilecektir.
Yazının orijinalini buradan okuyabilirsiniz
Kariyerime 26 yıl önce başladım. Windows ve Linux sistemlerinin kurulumu, yapılandırılması, yönetimi ve bakımı dahil olmak üzere birden fazla sistem üzerinde uzmanlaştım.
Açık kaynak dünyasındaki en son gelişmelerden haberdar olmaktan ve Linux hakkındaki en son araçları, özellikleri ve hizmetleri denemekten hoşlanıyorum.
Son 6 yıldır sistem ve ağ yöneticisi olarak görev yapıyorum ayrıca Pardus Dönüşüm Projesini yönetiyorum ve Pardus İşletim Sisteminin yaygınlaşması adına uğraş gösteriyorum.
Boş zamanlarımda açık kaynaklı uygulamaların Türkçe çevirisine katılıyorum ve The Document Foundation üyesiyim.