Edytor strumieni - zarządzanie wzorcami
Omówiliśmy już użycie wzorca i bufora wstrzymania. W tym rozdziale dowiemy się więcej o ich użyciu. Omówmynpolecenie, które drukuje przestrzeń wzoru. Będzie używany w połączeniu z innymi poleceniami. Poniżej podano składnię polecenia then.
[address1[,address2]]n
Weźmy przykład.
[jerry]$ sed 'n' books.txt
Wykonanie powyższego kodu da następujący wynik:
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
Plik n polecenie drukuje zawartość bufora wzorców, czyści bufor wzorców, pobiera następną linię do bufora wzorców i nakłada na niego polecenia.
Rozważmy wcześniej trzy polecenia SED n i dwa polecenia SED po n następująco:
Sed command #1
Sed command #2
Sed command #3
n command
Sed command #4
Sed command #5
W tym przypadku SED stosuje pierwsze trzy polecenia w buforze wzorców, czyści bufor wzorców, pobiera następną linię do bufora wzorców, a następnie stosuje do niego czwarte i piąte polecenie. To bardzo ważna koncepcja. Nie idź dalej bez jasnego zrozumienia tego.
Bufor wstrzymania przechowuje dane, ale poleceń SED nie można zastosować bezpośrednio do bufora wstrzymania. Dlatego musimy przenieść dane z bufora wstrzymania do bufora wzorców. SED zapewniaxpolecenie wymiany zawartości wzorca i przechowywania buforów. Poniższe polecenia ilustrująx Komenda.
Zmodyfikujmy nieco plik books.txt. Powiedzmy, że plik zawiera tytuły książek, po których następują nazwiska ich autorów. Po modyfikacji plik powinien wyglądać następująco:
[jerry]$ cat books.txt
Po wykonaniu powyższego kodu otrzymasz następujący wynik:
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
Wymieńmy zawartość obu buforów. Na przykład poniższy przykład drukuje tylko nazwiska autorów.
[jerry]$ sed -n 'x;n;p' books.txt
Po wykonaniu powyższego kodu otrzymasz następujący wynik:
George R. R. Martin
J. R. R. Tolkien
Paulo Coelho
J. R. R. Tolkien
Paulo Coelho
George R. R. Martin
Zrozummy, jak działa to polecenie.
Początkowo SED wczytuje do bufora wzorców pierwszą linię, tj. Burzę Mieczy.
x polecenie przenosi tę linię do bufora wstrzymania.
n pobiera następną linię, tj. George'a RR Martina do bufora wzorców.
Kontrolka przechodzi do polecenia, po którym następuje n, które wypisuje zawartość bufora wzorca.
Proces powtarza się do wyczerpania pliku.
Teraz wymieńmy zawartość buforów przed wydrukowaniem. Zgadnij, co się dzieje? Tak, drukuje tytuły książek.
[jerry]$ sed -n 'x;n;x;p' books.txt
Po wykonaniu powyższego kodu otrzymasz następujący wynik:
A Storm of Swords
The Two Towers
The Alchemist
The Fellowship of the Ring
The Pilgrimage
A Game of Thrones
Plik hpolecenie dotyczy bufora wstrzymania. Kopiuje dane z bufora wzorców do bufora wstrzymującego. Istniejące dane z bufora wstrzymania zostaną nadpisane. Zwróć uwagę, żehpolecenie nie przenosi danych, tylko kopiuje dane. W związku z tym skopiowane dane pozostają niezmienione w buforze wzorców. Poniżej podano składnięh Komenda.
[address1[,address2]]h
Następujące polecenie drukuje tylko tytuły autora Paulo Coelho.
[jerry]$ sed -n '/Paulo/!h; /Paulo/{x;p}' books.txt
Po wykonaniu powyższego kodu otrzymasz następujący wynik:
The Alchemist
The Pilgrimage
Zrozummy, jak działa powyższe polecenie. Zawartość books.txt ma określony format. Pierwsza linia to tytuł książki, po której następuje autor książki. W powyższym poleceniu „!” służy do odwrócenia warunku, tj. linia jest kopiowana do bufora wstrzymania tylko wtedy, gdy dopasowanie wzorca nie powiedzie się. Nawiasy klamrowe {} służą do grupowania wielu poleceń SED
W pierwszym przebiegu polecenia SED wczytuje pierwszą linię, tj. Burzę Mieczy do bufora wzorców i sprawdza, czy zawiera wzór Paulo, czy nie. Ponieważ dopasowanie wzorca nie powiedzie się, kopiuje tę linię do bufora wstrzymującego. Teraz zarówno bufor wzoru, jak i bufor wstrzymania zawierają tę samą linię, tj. Burzę Mieczy. W drugim kroku sprawdza, czy wiersz zawiera wzorzec Paulo, czy nie. Ponieważ wzór nie pasuje, nic nie robi.
W drugim przebiegu czyta następną linię George'a RR Martina do bufora wzorców i wykonuje te same kroki. W następnych trzech wierszach robi to samo. Pod koniec piątego przejścia oba bufory zawierają The Alchemist. Na początku szóstego przejścia odczytuje linię Paulo Coelho i gdy wzór pasuje, nie kopiuje tej linii do bufora wstrzymania. Stąd bufor wzorca zawiera Paulo Coelho, a bufor wstrzymania zawiera The Alchemist.
Następnie sprawdza, czy bufor wzorców zawiera wzorzec Paulo. Gdy dopasowanie wzorca powiedzie się, zamienia zawartość buforu wzorca z buforem wstrzymującym. Teraz bufor wzorca zawiera The Alchemist, a bufor wstrzymania zawiera Paulo Coelho. Na koniec wypisuje zawartość bufora wzorców. Te same kroki dotyczą wzoru Pielgrzymka.
Plik hpolecenie niszczy poprzednią zawartość bufora wstrzymującego. Nie zawsze jest to dopuszczalne, ponieważ czasami musimy zachować zawartość. W tym celu SED udostępniaHpolecenie, które dołącza zawartość do bufora wstrzymania, dodając nową linię na końcu. Jedyna różnica międzyh i Hjest takie, że pierwsza z nich zastępuje dane z bufora wstrzymania, podczas gdy późniejsza dodaje dane do bufora wstrzymania. Jego składnia jest podobna doh Komenda.
[address1[,address2]]H
Weźmy inny przykład. Tym razem, zamiast drukować tylko tytuły książek, drukuj również nazwiska ich autorów. Poniższy przykład drukuje tytuły książek, a po nich nazwiska ich autorów.
[jerry]$ sed -n '/Paulo/!h; /Paulo/{H;x;p}' books.txt
Po wykonaniu powyższego kodu otrzymasz następujący wynik:
The Alchemist
Paulo Coelho
The Pilgrimage
Paulo Coelho
Dowiedzieliśmy się, jak kopiować / dołączać zawartość bufora wzorca do przechowywania bufora. Czy możemy również wykonać funkcję odwrotną? Tak na pewno! W tym celu SED udostępniagpolecenie, które kopiuje dane z bufora wstrzymania do bufora wzorców. Podczas kopiowania istniejące dane z przestrzeni wzorca zostają nadpisane. Poniżej podano składnięg Komenda.
[address1[,address2]]g
Rozważmy ten sam przykład - drukowanie tytułów książek i ich autorów. Tym razem najpierw wypisujemy nazwisko autora, aw następnym wierszu odpowiedni tytuł książki. Następujące polecenie wyświetla nazwisko autora Paulo Coelho, a po nim tytuł książki.
[jerry]$ sed -n '/Paulo/!h; /Paulo/{p;g;p}' books.txt
Po wykonaniu powyższego kodu otrzymasz następujący wynik:
Paulo Coelho
The Alchemist
Paulo Coelho
The Pilgrimage
Pierwsza komenda jest zachowywana bez zmian. Pod koniec piątego przejścia oba bufory zawierają The Alchemist. Na początku szóstego przejścia odczytuje linię Paulo Coelho i gdy wzór pasuje, nie kopiuje tej linii do bufora wstrzymania. Stąd przestrzeń wzorca zawiera Paulo Coelho, a przestrzeń ładunkowa zawiera Alchemika.
Następnie sprawdza, czy przestrzeń wzorca zawiera wzorzec Paulo. Gdy dopasowanie wzorca się powiedzie, najpierw drukuje zawartość przestrzeni wzorca, np. Paulo Coelho, a następnie kopiuje bufor wstrzymujący do bufora wzorca. Dlatego zarówno wzorzec, jak i bufory uchwytu zawierają The Alchemist. Na koniec wypisuje zawartość bufora wzorców. Te same kroki dotyczą wzoru Pielgrzymka.
Podobnie możemy dołączyć zawartość bufora wstrzymującego do bufora wzorców. SED zapewniaG polecenie, które dołącza zawartość do bufora wzorców, dodając nowy wiersz na końcu.
[address1[,address2]]G
A teraz weźmy poprzedni przykład, który wypisuje nazwisko autora Paulo Coelhof, a następnie tytuł jego książki. Aby osiągnąć ten sam wynik, wykonaj następujące polecenie SED.
[jerry]$ sed -n '/Paulo/!h; /Paulo/{G;p}' books.txt
Po wykonaniu powyższego kodu otrzymasz następujący wynik:
Paulo Coelho
The Alchemist
Paulo Coelho
The Pilgrimage
Czy możesz zmodyfikować powyższy przykład, aby wyświetlić tytuły książek, a następnie ich autorów? Proste, po prostu wymień zawartość bufora przedG Komenda.
[jerry]$ sed -n '/Paulo/!h; /Paulo/{x;G;p}' books.txt
Po wykonaniu powyższego kodu otrzymasz następujący wynik:
The Alchemist
Paulo Coelho
The Pilgrimage
Paulo Coelho