logo

Örneklerle Linux/Unix'te Sed Komutu

Linux 'sed' komutu akış düzenleyici anlamına gelir. Düzenli ifadeler kullanarak akışları (dosyaları) düzenlemek için kullanılır. Ancak bu düzenleme kalıcı değildir. Yalnızca görüntüde kalır, ancak gerçekte dosya içeriği aynı kalır.

HTML etiketleri

Öncelikle metin ikamesi için kullanılır; ayrıca ekleme, silme, arama ve daha fazlası gibi diğer metin işleme işlemleri için de kullanılabilir. Sed komutu, dosyaları açmadan düzenlememizi sağlar. Düzenli ifade desteği onu daha güçlü bir metin işleme aracı haline getirir.

Sed komutuna genel bakış

Kompakt ve basit bir programlama diliyle metni dönüştüren ve ayrıştıran bir Unix yardımcı programıdır. 1973'ten 1974'e kadar Bell Laboratuvarlarından Lee E. McMahon tarafından entegre edilmiştir ve bugün neredeyse her işletim sistemi için mevcuttur. Sed komutu, önceki qed (hızlı düzenleyici) ve ed etkileşimli düzenleyicinin komut dosyası oluşturma özelliklerine dayanıyordu. Düzenli ifadeleri destekleyen en eski araçtı ve metin işleme için, en önemlisi de değiştirme komutuyla aktif olmaya devam ediyor. Ünlü alternatif araçlar arasında Perl ve AWK bulunmaktadır. 'akış düzenleme' ve düz metin dizesi manipülasyonu.

sed Komutunun Çalışma Modu

Sed komutu, metin işlemeye yönelik, satır odaklı bir yardımcı programdır: bir dosyadan veya giriş akışından metni, desen alanı olarak bilinen dahili bir ara belleğe satır satır okur. Tüm satır okumaları bir döngü başlatır. Sed komutu, bir sed betiği tarafından kalıp alanına açıklanan bir veya daha fazla işlemi kullanır. Metin üzerindeki işlemleri açıklayan yaklaşık 25 komutu kullanan bir programlama dilini çalıştırır.

Tüm giriş satırları için sed komutu normalde kalıp alanıyla sonuçlanır ve betiği çalıştırdıktan sonra döngüyü bir sonraki satırla yeniden başlatır. Diğer betik sonu doğaları, betik komutlarından ve ayar seçeneklerinden elde edilebilir; örneğin, bir sonraki satırı hemen desen alanına dahil etmek için N, çıkmak için q, desen alanını kaldırmak için d vb. Bu nedenle, bir sed betiği, döngü değişkeninin ve döngünün kendisinin korunduğu ve sed tarafından örtülü olarak tutulduğu bir akış çizgisinden yinelenen bir döngü gövdesiyle ilgilidir.

  • Bir sed betiği komut satırında açıklanabilir veya yalıtılmış bir dosya aracılığıyla okunabilir. Sed betiğinde komutlar, düzenli ifadeler veya satır numaraları bağlamında fazladan bir adres alabilir. Adres, komutun ne zaman yürütüleceğine karar verir. Örneğin, 2d yalnızca 2. giriş satırındaki d (veya sil) komutunu çalıştıracak, /^ /d ise boşlukla başlayan her satırı kaldıracaktır.
  • Yalıtılmış bir özel arabellek olan tutma alanı, bazı sed komutları tarafından döngüler arasında biriken bir metni tutmak için kullanılabilir. Sed'in komut dili yalnızca iki değişkene (desen alanı ve tutma alanı) ve GOTO benzeri dallanma işlevine sahiptir. Ancak dil Turing-tamamlanmıştır. Tetris, satranç, arkanoid ve sokoban gibi çeşitli oyunlar için ezoterik sed komut dosyaları mevcuttur.
  • Ana döngü, giriş akışının tüm satırları için çalışır ve girişin tüm satırlarındaki sed betiğini kontrol eder. Sed komut dosyası satırlarının tümü, hangi modelin eşleştirileceğini ve hangi eylemin uygulanacağını temsil eden ve koşullu bir ifade olarak kopyalanabilen bir model-eylem çiftidir. Varsayılan eylemler (desen alanını yazdırma, satırı desen alanına kopyalama), giriş ve çıkış akışları ve çalışma değişkenleri (alanı tutma ve desen alanı) örtülüdür; ana döngü nedeniyle kısa ve tek satırlık programlar belirtmek mümkündür.

sed Komutunun Kullanımı

    Değiştirme komutu
    Aşağıdaki örnek, sed komutunun en fazla komutunu ve tipik kullanımını, yani ikameyi temsil etmektedir. Kullanım sed komutunun asıl motivasyonuydu:
    sed 's/regexp/değiştirme/g' girdiDosyasıAdı > çıktıDosyaAdıSed'in diğer komutları
    Yaklaşık 25 sed komutuyla basit işlemler için başka yollar da mümkündür. Örneğin, aşağıda yalnızca boşlukları ve satır karakteri sonunu içeren satırları filtrelemek için d seçeneği kullanılmaktadır:
    sed '/^ *$/d' giriş DosyasıAdı
    Yukarıdaki örnek, aşağıdaki normal ifade meta karakterlerinden birkaçını kullanır:
    • Düzeltme işareti (^), satırın başlangıcıyla aynıdır.
    • Dolar sembolü ($) satırın tamamlanmasıyla aynıdır.
    • Yıldız işareti (*), daha fazla veya sıfır önceki karakter oluşumuyla aynıdır.
    • Artı sembolü (+), önceki bir veya daha fazla karakter oluşumuyla aynıdır.
    • Soru işareti (?), daha fazla veya sıfır önceki karakter oluşumuyla aynıdır.
    • Nokta sembolü (.) bir karakterle tamamen aynıdır.
    filtre olarak sed
    Genellikle sed komutu, Unix altında bir işlem hattının içindeki filtre olarak kullanılır:
    $oluşturmakVeri | sed 's/x/y/g'
    GenerateData programı veri üretir ve sed komutu, y'nin yerine x'i koyarak küçük bir değişiklik yapar.Dosya tabanlı sed komut dosyaları
    Genellikle, her satıra tek bir komut olacak şekilde çok sayıda sed komutunu bir betik dosyasına koymak ve komutları dosyadan yürütmek için -f bayrağını kullanmak yararlı olur:
    sed -f subst.sed girdiDosyasıAdı > çıktıDosyasıAdı

Sözdizimi:

 sed [OPTION]... {script-only-if-no-other-script} [input-file]... 

Seçenekler:

Sed komutunun bazı komut satırı seçenekleri şunlardır:

-n, --sessiz, --sessiz: Desen alanını güçlü bir şekilde basmamızı sağlar.

-e komut dosyası, --expression=komut dosyası: Çalıştırılacak komutlara script eklemek için kullanılır.

-f betik dosyası, --file=betik dosyası: Betik dosyasının içeriğini yürütülecek komutlara eklemek için kullanılır.

--follow-sembolik bağlantılar: yerinde işlenirken sembolik bağlantıları takip etmek için kullanılır.

-i[SUFFIX], --in-place[=SUFFIX]: dosyaları yerinde düzenlemek için kullanılır (SUFFIX seçeneği sağlanırsa yedekleme oluşturur).

-l N, --line-length=N: 'l' komutu için istenen satır sarma uzunluğunu belirtmek için kullanılır.

--posix: tüm GNU uzantılarını devre dışı bırakmak için kullanılır.

-E, -r, --regexp-genişletilmiş: Koddaki genişletilmiş düzenli ifadeleri kullanmamıza olanak tanır (taşınabilirlik için POSIX -E kullanın).

-s, --ayrı: dosyaları tek bir dosya olarak görmek yerine ayrı olarak değerlendirmek için kullanılır ve uzun akışı sürdürür.

--kum havuzu: Sandbox modunda çalışmak için kullanılır.

-u, --tamponlanmamış: Giriş dosyalarından minimum miktarda veri yüklemek için kullanılır ve çıkış arabelleklerini daha sık temizler.

-z, --null-veri: Satırları NUL karakterlere göre ayırmak için kullanılır.

--yardım: Yardım kılavuzunu görüntülemek için kullanılır.

--versiyon: Sürüm bilgisini görüntülemek için kullanılır.

Sed Komutu örnekleri

Aşağıdaki örnekleri görelim:

STDIN dizinine uygulama

sed komutu yalnızca dosyaları değiştirmekle sınırlı değildir; ayrıca bunu STDIN dizinine de uygulayabiliriz.

 echo class7 | sed 's/class/jtp/' echo class7 | sed 's/7/10/' cat msg.txt | sed 's/learn/study/' 

Yukarıdaki komutlar ilk metni ikinci metin modeliyle değiştirecektir. Aşağıdaki çıktıyı göz önünde bulundurun:

Linux Sed Filtresi

Yukarıdaki çıktıdan önce, 'class'ın 'jtp'ye ve 7'nin 10'a değiştirildiği 'class7' dizgisi üzerinde 'sed' komutunu gerçekleştirdik. Daha sonra 'msg.txt' akışı üzerinde 'sed' komutunu gerçekleştirdik. 'öğrenme'nin 'çalışma'ya dönüştürüldüğü yer.

Küresel Değiştirme

Önceki örnekte, tüm 'öğrenme' kelimeleri 'çalışma' şeklinde düzenlenmemişti. Her kelimeyi düzenlemek için genel yerine 'g' kullanmamız gerekir. Bir dosya veya dizedeki belirtilen tüm kelimeleri düzenleyecektir.

Sözdizimi:

 command | sed 's///g' 

Aşağıdaki örnekleri göz önünde bulundurun:

 echo class7 class9 | sed 's/class/jtp/g' cat msg.txt | sed 's/learn/study/g' 

Yukarıdaki komutlar belirtilen tüm metin modelinin yerini alacaktır. Aşağıdaki çıktıyı göz önünde bulundurun:

Linux Sed Filtresi

Yukarıdaki çıktıdan 'echo class7 class9 | sed 's/class/jtp/g'' tüm 'sınıf' 'jtp'ye dönüştürülür ve 'cat msg.txt | sed 's/learn/study/g'' tüm 'öğrenme', 'çalışma'ya dönüştürüldü.

Çizgiyi Kaldırma

'D' seçeneği bir dosyadan tüm satırı kaldırmamıza olanak tanır. Sadece o satırdan bir kelimeyi 'd' seçeneğiyle belirtmemiz yeterli, o satır silinecek. Ancak aynı kelimeyi içeren tüm satırların silineceğini unutmayın. Şu şekilde yürütülecektir:

 cat | sed '//d' 

Aşağıdaki komutu göz önünde bulundurun:

 cat msg.txt | sed '/jtp/d' 

Yukarıdaki komut 'jtp' kelimesinin bulunduğu satırları silecektir. Aşağıdaki çıktıyı göz önünde bulundurun:

Linux Sed Filtresi

Yukarıdaki çıktıdan 'cat msg.txt | sed '/jtp/d'' 'jtp' kelimesini içeren tüm satırlar silinir.

Çoklu sed Komutunu Kullanma

'-e' seçeneği birden fazla sed komutunu aynı anda çalıştırmamızı sağlar. Komutu şu şekilde çalıştırarak birden fazla sed işlemi gerçekleştirebiliriz:

 sed -e ' ; ' 

Aşağıdaki komutu göz önünde bulundurun:

 sed -e 's/red/blue/; s/yellow/black/' exm.txt 

Yukarıdaki komut 'exm.txt' dosyasında belirtilen tüm işlemleri uygulayacaktır. Aşağıdaki çıktıyı göz önünde bulundurun:

Linux Sed Filtresi

Yukarıdaki çıktıdan da görebileceğimiz gibi, tüm 'kırmızı' kelimeler 'mavi' ile, tüm 'sarı' kelimeler ise 'siyah' ile değiştirilmiştir. Komutları şu şekilde de ayırabiliriz:

 sed -e ' >s/red/blue/; >s/yellow/black/' exm.txt 

Sonuç yukarıdaki komutla aynı olacaktır.

Bir Dosyadan Komutları Okumak

Sed komutlarını bir dosyaya kaydedebilir ve herhangi bir dosyaya aynı anda uygulayabiliriz. '-f' seçeneği aşağıdaki gibi belirtilerek yapılabilir:

 sed -f 

Yukarıdaki komutta '', sed komut listesine sahip bir dosyadır. Aşağıdaki komutu göz önünde bulundurun:

 sed -f SedCommands exm.txt 

Yukarıdaki komut, 'exm.txt' dosyasındaki 'SedCommand' dosyasında belirtilen tüm komutları uygulayacaktır. Aşağıdaki çıktıyı göz önünde bulundurun:

Linux Sed Filtresi

Yukarıdaki çıktıdan önceki örneğe uygulanan komutları kullandık. Yani çıktı önceki örnekle aynıdır.

Karakterleri Değiştirme

Ünlem işaretini (!) Dize sınırlayıcı olarak kullanabiliriz. Örneğin, '/etc/passwd' dosyasında bash kabuğunu değiştirmek ve onu csh kabuğuyla değiştirmek istiyoruz. Bunu yapmak için aşağıdaki komutu yürütün:

 sed 's//bin/bash//bin/csh/' /etc/passwd 

Aşağıdaki komutu çalıştırarak aynı sonucu elde edebiliriz:

 sed 's!/bin/bash!/bin/csh!' /etc/passwd 

Sed'i sınırlamak

Sed komutunun temel kullanımı tüm dosyayı işler. Ancak sed komutunu sınırlandırabilir ve herhangi bir satırı belirtebiliriz. Sed komutunu sınırlamanın iki yolu vardır:

  • Bir dizi satır.
  • Belirli bir çizgiyle eşleşen bir desen.

Bir satırı belirtmek için aşağıdaki gibi bir sayı sağlayabiliriz:

 sed '3s/Red/Blue/' exm.txt 

Yukarıdaki komut belirtilen işlemi üçüncü satıra uygulayacaktır. Aşağıdaki çıktıyı göz önünde bulundurun:

Linux Sed Filtresi

Yukarıdaki çıktıdan yalnızca üçüncü satır değiştirilir.

Ayrıca bir satır aralığı da belirtebiliriz. Bir satır aralığı belirtmek için komutu aşağıdaki gibi yürütün:

 sed '1,3s/Red/Blue/' exm.txt 

Yukarıdaki komut, 1. ve 3. satırlarda belirtilen metni güncelleyecektir. Aşağıdaki çıktıyı göz önünde bulundurun:

Linux Sed Filtresi

Metin Ekleme ve Ekleme

'i' ve 'a' bayrağı, metni bir dosyaya eklemek ve eklemek için kullanılır. 'i' bayrağı metni dizeden önce ekleyecektir ve 'a' bayrağı dizeden sonra metin eklemek için kullanılır. Aşağıdaki komutu göz önünde bulundurun:

 echo 'Another Demo' | sed 'iFirst Demo' 

Yukarıdaki komut, metni 'Başka Bir Demo' metninin önüne ekleyecektir. Aşağıdaki çıktıyı göz önünde bulundurun:

Linux Sed Filtresi

Metin eklemek için komutu şu şekilde yürütün:

 echo 'Another Demo' | sed 'aFirst Demo' 

Yukarıdaki komut metni ekleyecektir. Aşağıdaki çıktıyı göz önünde bulundurun:

Linux Sed Filtresi

Satırları Değiştirme

'C' bayrağı belirli bir satırı değiştirmek için kullanılır. Bir satırı değiştirmek için komutu aşağıdaki gibi yürütün:

 sed '3cThis is a modified line.' exm.txt 

Yukarıdaki komut üçüncü satırı güncelleyecektir. Aşağıdaki çıktıyı göz önünde bulundurun:

Linux Sed Filtresi

Aynı kalıba sahip birden fazla satırı güncellemek için de normal ifade kullanabiliriz. Aşağıdaki komutu göz önünde bulundurun:

 sed '/Apple is /c Line updated.' exm.txt 

Yukarıdaki komut 'Apple is' dizesine sahip tüm satırları güncelleyecektir. Aşağıdaki çıktıyı göz önünde bulundurun:

Linux Sed Filtresi

Karakterlerin Dönüşümü

'Y' bayrağı karakterleri dönüştürmek için kullanılır. Karakterlerin dönüşümü belirli olaylarla sınırlandırılamaz. Karakterleri dönüştürmek için komutu şu şekilde yürütün:

 sed 'y/abc/def/' exm.txt 

Yukarıdaki komut 'a', 'b', 'c' karakterlerini 'd', 'e', ​​'f'ye dönüştürecektir. aşağıdaki çıktıyı göz önünde bulundurun:

Linux Sed Filtresi

Satır Numaralarını Yazdırma

'=' işareti satır numarasını yazdırmak için kullanılır. Satır numarasını yazdırmak için komutu aşağıdaki gibi yürütün:

 sed '=' exm.txt 

Yukarıdaki komut dosya içeriğinin satır numarasını gösterecektir. Aşağıdaki çıktıyı göz önünde bulundurun:

Linux Sed Filtresi

'-n' seçeneğiyle birlikte kullanılan eşittir işareti, eşleşen komut dosyasını içeren satır numarasını belirtir. Aşağıdaki çıktıyı göz önünde bulundurun:

 sed -n '/mango/=' exm.txt 

Yukarıdaki komut 'mango' kelimesini içeren satır numarasını gösterecektir. Aşağıdaki çıktıyı göz önünde bulundurun:

Linux Sed Filtresi

Yukarıdaki çıktıdan 2 numaralı satırın 'mango' kelimesine sahip olduğunu görebiliriz.