Akış Düzenleyici - Kalıpları Yönetme

Pattern ve hold tamponunun kullanımını daha önce tartışmıştık. Bu bölümde, kullanımları hakkında daha fazlasını keşfedeceğiz. Hadi tartışalımndesen alanını yazdıran komut. Diğer komutlarla birlikte kullanılacaktır. Aşağıda, komutun sözdizimi verilmiştir.

[address1[,address2]]n

Bir örnek ele alalım.

[jerry]$ sed 'n' books.txt

Yukarıdaki kod çalıştırıldığında aşağıdaki sonucu verecektir:

1) A Storm of Swords, George R. R. Martin, 1216 
2) The Two Towers, J. R. R. Tolkien, 352 
3) The Alchemist, Paulo Coelho, 197 
4) The Fellowship of the Ring, J. R. R. Tolkien, 432 
5) The Pilgrimage, Paulo Coelho, 288 
6) A Game of Thrones, George R. R. Martin, 864

n komutu, model arabelleğinin içeriğini yazdırır, model arabelleğini temizler, sonraki satırı model arabelleğine alır ve üzerine komutlar uygular.

Daha önce üç SED komutu olduğunu düşünelim n ve ardından iki SED komutu n aşağıdaki gibi:

Sed command #1 
Sed command #2 
Sed command #3 
n command 
Sed command #4 
Sed command #5

Bu durumda, SED model ara belleğine ilk üç komutu uygular, model ara belleğini temizler, sonraki satırı model ara belleğine getirir ve daha sonra dördüncü ve beşinci komutları uygular. Bu çok önemli bir kavram. Bunu net bir şekilde anlamadan devam etmeyin.

Tutma arabelleği verileri tutar, ancak SED komutları doğrudan tutma arabelleğine uygulanamaz. Bu nedenle, tutma tamponu verilerini şablon tamponuna getirmemiz gerekir. SED,xkalıbın içeriğini değiştirme ve tamponları tutma komutu. Aşağıdaki komutlar,x komut.

Books.txt dosyasını biraz değiştirelim. Diyelim ki dosya kitap başlıklarını ve ardından yazar adlarını içeriyor. Değişiklikten sonra dosya şu şekilde görünmelidir:

[jerry]$ cat books.txt

Yukarıdaki kodu çalıştırdığınızda aşağıdaki sonucu alırsınız:

A Storm of Swords 
George R. R. Martin 
The Two Towers 
J. R. R. Tolkien 
The Alchemist 
Paulo Coelho 
The Fellowship of the Ring 
J. R. R. Tolkien 
The Pilgrimage 
Paulo Coelho 
A Game of Thrones 
George R. R. Martin

İki tamponun içeriğini değiştirelim. Örneğin, aşağıdaki örnek yalnızca yazarların adlarını yazdırır.

[jerry]$ sed -n 'x;n;p' books.txt

Yukarıdaki kodu çalıştırdığınızda aşağıdaki sonucu alırsınız:

George R. R. Martin 
J. R. R. Tolkien 
Paulo Coelho 
J. R. R. Tolkien 
Paulo Coelho 
George R. R. Martin

Bu komutun nasıl çalıştığını anlayalım.

  • Başlangıçta, SED ilk satırı, yani A Storm of Swords'u şablon ara belleğine okur.

  • x komutu bu satırı tutma arabelleğine taşır.

  • n sonraki satırı, yani George RR Martin'i şablon tamponuna getirir.

  • Kontrol, model arabelleğinin içeriğini yazdıran n'den sonra komuta geçer.

  • İşlem, dosya bitene kadar tekrar eder.

Şimdi yazdırmadan önce tamponların içeriğini değiştirelim. Tahmin et ne olur? Evet, kitapların adlarını yazdırıyor.

[jerry]$ sed -n 'x;n;x;p' books.txt

Yukarıdaki kodu çalıştırdığınızda aşağıdaki sonucu alırsınız:

A Storm of Swords 
The Two Towers 
The Alchemist 
The Fellowship of the Ring 
The Pilgrimage 
A Game of Thrones

hkomutu, tutma arabelleği ile ilgilenir. Verileri model arabelleğinden tutma arabelleğine kopyalar. Tutma arabelleğindeki mevcut verilerin üzerine yazılır. Unutmayın kihkomutu verileri taşımaz, yalnızca verileri kopyalar. Bu nedenle, kopyalanan veriler model arabelleğinde olduğu gibi kalır. Aşağıda verilen sözdizimih komut.

[address1[,address2]]h

Aşağıdaki komut yalnızca yazar Paulo Coelho'nun başlıklarını yazdırır.

[jerry]$ sed -n '/Paulo/!h; /Paulo/{x;p}' books.txt

Yukarıdaki kodu çalıştırdığınızda aşağıdaki sonucu alırsınız:

The Alchemist 
The Pilgrimage

Yukarıdaki komutun nasıl çalıştığını anlayalım. Books.txt’nin içeriği belirli bir formatı izler. İlk satır kitap başlığı ve ardından kitabın yazarıdır. Yukarıdaki komutta "!" koşulu tersine çevirmek için kullanılır, yani satır yalnızca bir model eşleşmesi başarılı olmadığında tutma tamponuna kopyalanır. Ve küme parantezleri {} birden çok SED komutunu gruplamak için kullanılır

Komutun ilk geçişinde, SED ilk satırı, yani A Storm of Swords'u şablon tampon belleğine okur ve Paulo desenini içerip içermediğini kontrol eder. Kalıp eşleşmesi başarılı olmadığından, bu satırı tutma arabelleğine kopyalar. Şimdi hem desen tamponu hem de tutma tamponu aynı satırı içerir, yani A Storm of Swords. İkinci adımda, satırın Paulo desenini içerip içermediğini kontrol eder. Desen eşleşmediğinden hiçbir şey yapmaz.

İkinci geçişte, bir sonraki George RR Martin satırını şablon tamponuna okur ve aynı adımları uygular. Sonraki üç satır için de aynı şeyi yapıyor. Beşinci geçişin sonunda her iki tamponda da Simyacı bulunur. Altıncı geçişin başlangıcında, Paulo Coelho satırını okur ve şablon eşleştikçe, bu satırı bekletme tamponuna kopyalamaz. Bu nedenle, kalıp tamponu Paulo Coelho'yu içerir ve tutma tamponu The Alchemist'i içerir.

Bundan sonra, desen arabelleğinin Paulo desenini içerip içermediğini kontrol eder. Desen eşleşmesi başarılı olduktan sonra, desen tamponunun içeriğini tutma tamponuyla değiştirir. Artık desen tamponu The Alchemist'i ve tutma tamponu Paulo Coelho'yu içeriyor. Son olarak, desen tamponunun içeriğini yazdırır. Aynı adımlar Hac modeline de uygulanır.

hkomutu, tutma arabelleğinin önceki içeriğini yok eder. Bazen içeriği korumamız gerektiği için bu her zaman kabul edilebilir değildir. Bu amaçla SED,HSonuna yeni bir satır ekleyerek içeriği tutma arabelleğine ekleyen komut. Arasındaki tek farkh ve Hkomutu, birincisi tutma arabelleğindeki verilerin üzerine yazarken, daha sonra verileri tutma arabelleğine ekler. Sözdizimi şuna benzer:h komut.

[address1[,address2]]H

Başka bir örnek alalım. Bu sefer sadece kitap başlıklarını yazdırmak yerine yazarlarının adlarını da yazdırın. Aşağıdaki örnek, kitap başlıklarını ve ardından yazar adlarını yazdırır.

[jerry]$ sed -n '/Paulo/!h; /Paulo/{H;x;p}' books.txt

Yukarıdaki kodu çalıştırdığınızda aşağıdaki sonucu alırsınız:

The Alchemist 
Paulo Coelho 
The Pilgrimage
Paulo Coelho

Tamponu tutmak için şablon tamponunun içeriğini nasıl kopyalayacağımızı / ekleyeceğimizi öğrendik. Ters işlevi de yapabilir miyiz? Evet kesinlikle! Bu amaçla SED,gVerileri tutma arabelleğinden model arabelleğine kopyalayan komut. Kopyalama sırasında, desen alanındaki mevcut verilerin üzerine yazılır. Aşağıda verilen sözdizimig komut.

[address1[,address2]]g

Aynı örneği ele alalım - kitap başlıklarını ve yazarlarını yazdırmak. Bu sefer önce yazarın adını ve sonraki satıra karşılık gelen kitap başlığını yazdıracağız. Aşağıdaki komut yazar Paulo Coelho'nun adını ve ardından kitabın adını yazdırır.

[jerry]$ sed -n '/Paulo/!h; /Paulo/{p;g;p}' books.txt

Yukarıdaki kodu çalıştırdığınızda aşağıdaki sonucu alırsınız:

Paulo Coelho 
The Alchemist 
Paulo Coelho 
The Pilgrimage

İlk komut olduğu gibi tutulur. Beşinci geçişin sonunda, her iki tamponda da Simyacı bulunur. Altıncı geçişin başlangıcında, Paulo Coelho satırını okur ve şablon eşleştikçe, bu satırı bekletme tamponuna kopyalamaz. Dolayısıyla, desen alanıPaulo Coelho'yu ve bekleme alanı The Alchemist'i içerir.

Daha sonra, desen uzayının Paulo desenini içerip içermediğini kontrol eder. Model eşleşmesi başarılı olduktan sonra, önce model uzayının içeriğini, yani Paulo Coelho'yu yazdırır, sonra tutma tamponunu model ara belleğine kopyalar. Dolayısıyla, hem desen hem de tutma tamponları The Alchemist'i içerir. Son olarak, desen tamponunun içeriğini yazdırır. Aynı adımlar Pilgrimage modeline de uygulanır.

Benzer şekilde, tutma tamponunun içeriğini şablon tamponuna ekleyebiliriz. SED,G Sonuna yeni bir satır ekleyerek içeriği şablon arabelleğine ekleyen komut.

[address1[,address2]]G

Şimdi, yazar Paulo Coelhof'un adını kitap başlığının ardından yazan bir önceki örneği alalım. Aynı sonucu elde etmek için aşağıdaki SED komutunu yürütün.

[jerry]$ sed -n '/Paulo/!h; /Paulo/{G;p}' books.txt

Yukarıdaki kodu çalıştırdığınızda aşağıdaki sonucu alırsınız:

Paulo Coelho 
The Alchemist 
Paulo Coelho 
The Pilgrimage

Kitap adlarını ve ardından yazarlarını görüntülemek için yukarıdaki örneği değiştirebilir misiniz? Basit, sadece tampon içeriğini değiştirmeden önceG komut.

[jerry]$ sed -n '/Paulo/!h; /Paulo/{x;G;p}' books.txt

Yukarıdaki kodu çalıştırdığınızda aşağıdaki sonucu alırsınız:

The Alchemist 
Paulo Coelho 
The Pilgrimage 
Paulo Coelho