Sed

Ubuntu Türkiye Wiki sitesinden
Şuraya atla: kullan, ara

SED (Stream editor)

Metin dosyaları üzerinde sürekli işlem yapanlar için sed ve vi hemen imdada yetişir. Bu iki programın yapabildiklerini etkileşimli olarak bir metin editörü üzerinden gerçekleştirebilmek de mümkündür. sed ve vi tam anlamıyla zaman kaybını önleyen kullanıcı dostu iki uygulamadır. Yapısal olarak diğer programlama dillerinden biraz farklı olduklarından öğrenmesi biraz zaman alır. Buna rağmen eğer metin editörlüğü işinizin bir parçası ise sed ve vi'ı öğrenip bunlardan verimli bir şekilde yararlanmanız uygun olacaktır.

Sed ve Özellikleri

Sed bir dosyadan veya standart girdiden(klavyeden) bilgi okur ve standart çıktıya (ekrana) okuduğu bilgileri kullanıcının belirlediği düzene sokarak yazar. Bu veriyi de kullanıcı genellikle bir dosyaya yerleştirir. Sed komut satırında iken veya bir kabuk programı içinden kullanılabilir.

Örnekler

Sed kullanırken en çok başvuracağınız işleç `s' işlecidir. Bir karakteri veya karakter kümesini başka bir diziye çevirmeye yarar. Buna basit bir örnek:


sed 's/hapisane/hapishane/g' dosya

Komutun sonundaki `g' işleci, sed'e dosyanın tamamını araştırmasını söyler. Eğer bunu kaldırırsanız, sed her satırın başında bulduğu ilk değiştirmeyi yapacak ve satırın geri kalanına dokunmayacaktır. Aşağıdaki karakterler sed tarafından kullanılan özel karakterler kapsamına girer. Bu karakterlerin herbirisinin anlamı olduğundan dikkatli kullanılmaları gerekir.


.*[]^$\&

Yukarıdaki karakterleri gözönüne almadan yapılan aşağıdaki gibi bir kullanım hataya yol açar.


 sed 's/[J.S. Bach]/[Bach, J.S]/' dosya 

Bunun yerine her özel karakterin başına `\' karakteri getirilerek özel anlamlarının yitirilmesi sağlanabilir (saklama işlemi). Yukarıda çalışmayan örneği yeniden düzenleyerek yazalım:


 sed 's/\[J\.S\. Bach\]/[Bach, J.S ]/' dosya 

Aynı anda birden çok değiştirme yapabilmek için ise her argüman için -e kullanılır.


 sed -e 's/computer/bilgisayar/g' -e 's/server/sunucu/g' dosya 

İçinde '/' karakteri olan bir diziyi değiştirmek için ne yapmalı? Bu, özel karakter sınıfına girdiği için karakterin özel anlamını yitirmesi sağlanır.


 sed 's/\/usr\/bin/\/bin/g' dosya 

Düzenli İfadeler (Regular Expressions)

Sed, UNIX üzerinde metin işleyen birçok program gibi düzenli ifadelerden yararlanır. Aşağıdaki bu duruma birkaç örnekle yer veriliyor. '^' karakteri satır başlangıcını gösterir. Bu komut,


sed 's/^Pts /Pazartesi/' dosya

bir satırın başında ``Pts varsa bunu ``Pazartesi haline getirir. Dikkat ederseniz komut dahilinde `g' işleci kullanılmamıştır. Çünkü her satırda sadece bir satır başı olabilir. $ karakteri satır sonunu belirtir. Aşağıdaki örnekte,


sed 's/ $//' dosya

Sed komutu satır sonundaki tüm boşluk karakterlerini siler. Her satır sonuna ``SATIR_SONU karakter kümesini getirmek için


sed 's/$/SATIR_SONU/' dosya

yazılabilir. Boş bir satırı bulmak için satır başı ve satır sonu belirteçleri birlikte kullanılır.


sed 's/^$/bu daha once bos bir satirdi/' dosya

`.' (nokta) karakteri herhangi bir karakter anlamına gelir. Örneğin üzerinde işlem yapacağımız dosyada bütün satırlardaki ilk iki karakteri silmek için:


sed 's/^..//' dosya

Köşeli parantezler birden fazla sayıda karakter içinde seçim yapar.


sed 's/[Oo]pen[Ww]in/openwin/g' dosya

Alfabedeki iki karakterin arasındaki tüm karakterleri seçmek için köşeli parantezlerin içinde `-' karakteri kullanılabilir. Bu karakter, sağındaki ve solundaki de dahil olmak üzere aradaki tüm harfleri seçer. Örnek dosyadaki tüm büyük harfleri silelim.


sed 's/[A-Z]//g' dosya

Bir karakter kümesinin dışında kalan karakterleri seçmek için ise `^' kullanılır. Örnek dosyada, rakamların ve küçük harflerin dışındaki tüm harfleri silmek istiyoruz.


sed 's/[^1-9a-z]//g' dosya

'*' karakteri, kendisinden bir önce gelen karakterin veya küme içine alınmış karakter gruplarının sıfır veya daha fazla tekrarı anlamına gelir.


sed 's/^ *//' dosya

komutu her satır başındaki boşluk karakterlerini siler. Aşağıdaki sed komutu her satırdaki son kelimeyi (boşluk karakterlerinden oluşmayan karakterler grubunu) siler.


sed 's/[^ ]*$//' dosya

unutulmaması gereken bir nokta, `*' karakteri önceki grubun sıfır kere tekrarını da gözönüne alır, bu durumda aşağıdaki satırda görülen ve bir tamsayı değerini ``TAMSAYI sözcüğü haline getirmek için kullanılan komut Linux tarafından yanlış işletilecektir.


sed 's/ [0-9]* / TAMSAYI /g' dosya

Bu satır aynı zamanda her boşluk karakterini ``TAMSAYI ya çevirir. Bunu engellemek için, en azından bir haneyi arama kapsamına sokmak gerekir:


sed 's/ [0-9][0-9]* / TAMSAYI /g' dosya

`.* harf kombinasyonu herhangi bir sayıda karakter grubu anlamındadır. Aşağıdaki örnekte, ``ku ve ``ik arasında ne olursa olsun bulunan satırı değiştirecek ve bunların yerine ``kuru erik koyacaktır.


sed 's/ku.*ik/kuru erik/g' dosya

Buraya kadarki bölümde eşleştirdiğimiz harf veya harf gruplarını ya başka bir forma soktuk ya da tamamen sildik. Ancak sed'in kelime işleme kapasitesi sadece yaptıklarımızla sınırlı değildir. `\(' ve `\)' operatörleri yardımıyla eşleştirildiği anda hafızaya kaydedilen kelime grupları daha sonra tekrar çağırılabilir. Parantezler özel anlamlı karakterlerin anlamlarını yitirmesini sağlamak amacıyla daha önceki kullanıma uygun konulmuşlardır. İlk kullanılan `\(\)' operatörü `\1' adlı alana, ikinci kullanılan `\(\)' operatörü `\2' adlı alana eşleştirilir (kayıt edilir). Aşağıdaki sed komutu,


sed 's/^\([A-Za-z][A-Za-z]*\) \([A-Za-z][A-Za-z]*\)/\2 \1/' dosya

bir dosyadaki ``isim soyisim sırasını ``soyisim isim sırasına çevirmekte kullanılabilir. Örnek olarak içeriği aşağıdaki gibi olan bir dosya üzerinde bu komut çalıştırılırsa


Mehmet Kırk<br />

Biray Çift<br />

Gürkan Ballı<br />

ekranda aşağıdaki çıktı görünür:


Kırk Mehmet<br />
Çift Biray<br />
Ballı Gürkan<br />

Bazı durumlarda tüm dosya üzerinde değil de bazı özellikleri sağlayan satırlar üzerinde işlem yapmak isteyebilirsiniz. Bunun için 'adresleme' yapmanız gerekir. Adresleme işlemi, `s işlecinden hemen önce yapılır. Bu komut ile dosyanın sadece 1 ve 20. satırları arasında işlem yapılacaktır.


sed '1,20s/Karadeniz/Akdeniz/g' dosya

``Makina'' kelimesiyle başlayan tüm satırlardaki ``Endüstri kelimesi yerine ``Elektronik kelimesini yerleştirelim.


sed '/^Makina/s/Maden /Elektronik /g' dosya

``Makina'' kelimesiyle başlamayan tüm satırlara benzer işlemi uygulayalım. `!' karakterinin yerine dikkat edin.


sed '/^Makina/!s/Maden /Elektronik /g' dosya

Sed Kaynak Dosyası

Eğer sed kaynak satırınız bir iki satıra sığmayacak kadar büyük ise komutları tek dosya altında toplayabilirsiniz. Bu örnekte degistir.sed isimli dosyaya üç satırlık sed komutu yazalım.

s/tiren/tren/g<br />
s/Pazar/Pazartesi/g<br />
s/1996/1997/g<br />

Ardından sed komutunu -f parametresiyle çalıştıralım.


sed -f degistir.sed dosya

Bunların yerine kendi kendine çalışan bir sed programı yazmaya ne dersiniz?


<br />#!/usr/bin/sed -f<br />
# degistir.sed dosyasi<br />
s/tiren/tren/g<br />
s/Pazar/Pazartesi/g<br />
s/1996/1997/g<br />

Çalıştırmak için dosya izni verdikten sonra


chmod u+x degistir.sed

Komut satırı üzerinden rahatlıkla çalıştırabiliriz


$ degistir.sed dosya

Kaynak

http://belgeler.org/lis/archive-tlkg-lis-7.1.html

Unix komutları (daha fazla)
Dosya dizgesi catcdchmodchgrpchowncksumcmp cpdddudf fsckfuserlnlslsattrlsofmkdirmountmvpwdrm rmdirsplittouchumask
Süreç ve görev yönetimi atchrootcroncrontabexitkillkillallnicepgreppidofpkillpspstreesleeptimetopwait
Kullanıcı ortamı envfingeridlognamemesgpasswdsusudouptimewwallwhowhoamiwrite
Metin işleme awkcommcsplitcutdiffedexfmtheadiconvjoinlessmorepastesedsortstringstailtalktruniqvivimwcxargs
Kabuk programlama aliasbasenamedirnameechoexprfalseprintftesttrueunset
Ağ Araçları inetdhostifconfignetcatnetstatnslookuppingrlogintraceroute
Arama findgreplocatewhereiswhich
Diğer aproposbannerbccalcleardateddfilehelphistoryinfolplprmanpaxsizeteetputtypeunamewhatisyes