18
Konuya ait anahtar kelimeler : SED - Bölüm 2 Sed Bul ve Değiştir: Sed komutu ile veri üzerinde herhangi bir kelimenin başka bir kelime ile değiştirilmesi, sed 's/aranan_kelime/yeni_kelime/' dosya_adi şeklinde olmaktadır. Şimdi "sedex" dosyamız içerisinde "tiren" kelimesini "tren" kelimesi ile değiştirerek ekrana yazdıralım.
[alax@alax ~]$ cdd [alax@alax script]$ sed 's/tiren/tren/' sedex Burası ilk satır. Kara tren gecikir. Buharlı tren. Hızlı tren. Mavi tren. Burası altıncı satır. [alax@alax script]$
Şimdi "sedex" dosyamıza "Beyaz tiren, kırmızı tiren." cümlesini ekleyelim ve yukarıdaki örneğimizi tekrardan uygulayalım.
[alax@alax script]$ echo "Beyaz tiren, kırmızı tiren." >> sedex [alax@alax script]$ cat -n sedex # Dosya içeriğinin son halini görelim. 1 Burası ilk satır. 2 Kara tiren gecikir. 3 Buharlı tren. 4 Hızlı tiren. 5 Mavi tren. 6 Burası altıncı satır. 7 Beyaz tiren, kırmızı tiren. [alax@alax script]$ sed 's/tiren/tren/' sedex Burası ilk satır. Kara tren gecikir. Buharlı tren. Hızlı tren. Mavi tren. Burası altıncı satır. Beyaz tren, kırmızı tiren. [alax@alax script]$
Gördüğünüz gibi son eklediğimiz satırda bulunan ikinci "tiren" kelimesi hala aynı. Bunun sebebi "sed" ile kelime değiştirme işlemi yapılırken, herhangi bir satırda birden çok aranılan kelime bulunuyorsa bu kelimelerden ilk olanı işleme alınır, diğerleri herhangi bir işleme tabii tutulmaz. Bunun çözümü ise "g" opsiyonunu kullanmaktır. Herhangi bir dosyadaki istediğimiz "BÜTÜN" kelimelerin değişmesi için aşağıdaki biçimde kullanım uygulanmalıdır. Yani komut sonuna "g" parametresini eklemeliyiz.
[alax@alax script]$ sed 's/tiren/tren/g' sedex Burası ilk satır. Kara tren gecikir. Buharlı tren. Hızlı tren. Mavi tren. Burası altıncı satır. Beyaz tren, kırmızı tren. [alax@alax script]$
Bütün satırların önünde "++ " iki artı ve bir boşluk karakterinin olmasını sağlayalım. Satır başı demek üzeri,şapka işareti demek olduğunu önceki derslerimizden biliyor olmalısınız.
[alax@alax script]$ sed 's/^/++ /' sedex ++ Burası ilk satır. ++ Kara tiren gecikir. ++ Buharlı tren. ++ Hızlı tiren. ++ Mavi tren. ++ Burası altıncı satır. ++ Beyaz tiren, kırmızı tiren. [alax@alax script]$
Yukarıdaki örneğe ilaveten satır sonlarında da ">" büyüktür işaretinin de olmasını sağlayalım. Bunu "pipeline" kullanarak gerçekleştirelim.
[alax@alax script]$ sed 's/^/++ /' sedex | sed 's/$/>/' ++ Burası ilk satır.> ++ Kara tiren gecikir.> ++ Buharlı tren.> ++ Hızlı tiren.> ++ Mavi tren.> ++ Burası altıncı satır.> ++ Beyaz tiren, kırmızı tiren.> [alax@alax script]$ sed 's/$/>/' sedex # Yada sadece satır sonuna ">" ekleme. Burası ilk satır.> Kara tiren gecikir.> Buharlı tren.> Hızlı tiren.> Mavi tren.> Burası altıncı satır.> Beyaz tiren, kırmızı tiren.> [alax@alax script]$
Yukarıdaki örneğimizi "pipeline" kullanmadan gerçekleştirmek isteseydik o zaman "-e" opsiyonunu kullanmamız gerekecekti. Şimdi yukarıdaki ilk örneğimizi "pipeline" kullanmadan yapmaya çalışalım.
[alax@alax script]$ sed -e 's/^/++ /' -e 's/$/>/' sedex ++ Burası ilk satır.> ++ Kara tiren gecikir.> ++ Buharlı tren.> ++ Hızlı tiren.> ++ Mavi tren.> ++ Burası altıncı satır.> ++ Beyaz tiren, kırmızı tiren.> [alax@alax script]$
Gördüğünüz gibi Unix/Linux sistemlerin bu şekilde, bir olayın gerçekleşmesi için bizlere birden fazla yol sunduğunu bir kez daha görmüş olduk. Biz çalışmalarımızda çoğu zaman "pipeline" kullanacağız. Önceki konularda anlatılan "pipeline"(boru, boru yolu) konusunu çok iyi anlamanız sizlere herzaman fazladan bir çıkış yolu sunacaktır. Sed değişiklikleri kaydetme: "Sed" komutu ile yapılan değişiklikleri kaydetmek için ">" büyüktür işaretini yada "w" opsiyonunu kullanmamız yeterlidir. Nasıl bir dosya oluşturmak için bu işareti kullanıyorsak, aynı şekilde komut sonuna " > dosya_adi " şeklinde ekleme yaparak değişikliklerin "dosya_adi" adındaki dosyaya kaydedilmesini sağlayabiliriz. "w" opsiyonu ile çıktıları bir dosyaya kaydetmek için, kullanım: sed '/sed komutları/w çıkış_dosya_adı' dosya_adi şeklinde olmaktadır. Fakat herhangi bir çıktıyı bir dosyaya kaydetmek için ">" büyüktür yada ">>" çift büyüktür işaretlerini kullanmanızı tavsiye ederiz. Seçim sizin. Şimdi "tiren" kelimelerini "tren" kelimesi ile değiştirelim ve içeriğin son halini "sed.txt" dosyasına kaydedelim.
[alax@alax script]$ sed 's/tiren/tren/g' sedex > sed.txt [alax@alax script]$ ls # Dosyaları listeleyelim, sed.txt dosyası oluşmuş. script1.sh script2.sh script3.sh script4.sh sedex sed.txt [alax@alax script]$ cat sed.txt Burası ilk satır. Kara tren gecikir. Buharlı tren. Hızlı tren. Mavi tren. Burası altıncı satır. Beyaz tren, kırmızı tren. [alax@alax script]$
Evet gördüğünüz gibi orjinal dosya içeriği değişmeden, istenilen değişiklikler "sed.txt" adlı dosyaya kaydedilmiş oldu. Eğer "w" opsiyonu ile dosyaya kaydetme işini yapmak isteseydik, o zaman,
[alax@alax script]$ sed 's/tiren/tren/gw sed.txt' sedex
şeklinde komut sonuna "w" ekledikten sonra dosya adını yazmamız gerekir. Tabi önceden de belirttiğimiz üzere, varolan bir dosyaya ekleme yapmak isteseydik, o zaman ">" yerine ">>" komutunu kullanacaktık. Biz yeni bir dosya oluşturduğumuz için ">" kullandık. Not: Sed kullanımında yapılan değişikliklerin orjinal dosya üzerine yazılması için -i parametresini kullanabilirsiniz. Fakat dikkatli olmanız gereklidir, çünkü bu işlemin geridönüşü yoktur. Eğer kodlarınızı ve yapılacak değişikleri doğru yaptığınıza inanıyorsanız o zaman -i parametresini kullanabilirsiniz. Değişikliklerin yapıldığı dosya orjinal dosya üzerine yapıştırılacaktır. Böylece ekstra dosya ile uğraşmanıza gerek yok. Örnek kullanım: sed -i '..işlemler..' dosya_adi yukarıdaki örnek sonucunda işlemler orjinal dosya üzerinde kalıcı olarak yapılacaktır. Sed genel tekrar: Şimdi "/usr/bin" klasörü içerisindeki dosyaların adları "sh" ile bitenleri "sed_deneme.txt" adlı dosyaya yazdıralım.
[alax@alax script]$ ls /usr/bin | sed -n '/.sh$/p' > sed_deneme.txt [alax@alax script]$ cat sed-deneme.txt alsa-info.sh amuFormat.sh avahi-publish bash bssh capsh chsh c_rehash findssl.sh gettext.sh gpgkey2ssh gvfs-trash jemalloc.sh l. . ... [alax@alax script]$
Yada ikinci harfi "a" olan dosya isimlerini "a_dosya.txt" dosyaya yazdıralım.
[alax@alax script]$ ls /usr/bin | sed -n '/^.a.*/p' > a_dosya.txt [alax@alax script]$ cat a_dosya.txt bacman badblocks base64 basename bash bashbug cache_check cache_dump cache_metadata_size cache_repair cache_restore cairo-sphinx cairo-trace cal capsh captoinfo cat catchsegv catman data2inc . ... [alax@alax script]$
Yukarıdaki örneğimizin sadece ilk üç satırını bir dosyaya çekelim.
[alax@alax script]$ ls /usr/bin | sed -n '/^.a.*/p' | head -3 > _dosya.txt [alax@alax script]$ cat _dosya.txt bacman badblocks base64 [alax@alax script]$
Bu örneğimizde, "sedex" dosyası içeriğinde 1. satırdan başlayarak iki satır atlayarak verileri gösterelim.
[alax@alax script]$ sed -n '1~2'p sedex Burası ilk satır. Buharlı tren. Mavi tren. Beyaz tiren, kırmızı tiren. [alax@alax script]$
Şimdi sadece "sedex" dosyasında altıncı satırı gösterelim.
[alax@alax script]$ sed -n '6'p sedex Burası altıncı satır. [alax@alax script]$
Son olarak "sedex" dosyası içerisinde 1,2 ve 6. satırları gösterelim.
[alax@alax script]$ sed -n -e '1,2'p -e 6p sedex Burası ilk satır. Kara tiren gecikir. Burası altıncı satır. [alax@alax script]$
İnternette arama yaparak daha fazla "sed" komutu örneklerine ulaşabilirsiniz. Herhangi bir konuda uzmanlaşmak için her zaman daha fazla pratik yapmak gerekir. Hiçbir zaman pes etmeyin ve herzaman daha çok örnek yapın.