Edytor strumienia - bufor wzorców
Jedną z podstawowych operacji, które wykonujemy na dowolnym pliku, jest wyświetlenie jego zawartości. W tym celu możemy użyćprintpolecenie, które wypisuje zawartość bufora wzorców. Dowiedzmy się więc więcej o buforze wzorców
Najpierw utwórz plik zawierający numer linii, nazwę książki, jej autora i liczbę stron. W tym samouczku będziemy używać tego pliku. Możesz użyć dowolnego pliku tekstowego według własnego uznania. Nasz plik tekstowy będzie wyglądał następująco:
[jerry]$ vi books.txt
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
Teraz wydrukujmy zawartość pliku.
[jerry]$ sed 'p' books.txt
Wykonanie powyższego kodu da następujący wynik.
1) A Storm of Swords, George R. R. Martin, 1216
1) A Storm of Swords, George R. R. Martin, 1216
2) The Two Towers, J. R. R. Tolkien, 352
2) The Two Towers, J. R. R. Tolkien, 352
3) The Alchemist, Paulo Coelho, 197
3) The Alchemist, Paulo Coelho, 197
4) The Fellowship of the Ring, J. R. R. Tolkien, 432
4) The Fellowship of the Ring, J. R. R. Tolkien, 432
5) The Pilgrimage, Paulo Coelho, 288
5) The Pilgrimage, Paulo Coelho, 288
6) A Game of Thrones, George R. R. Martin, 864
6) A Game of Thrones, George R. R. Martin, 864
Możesz się zastanawiać, dlaczego każda linia jest wyświetlana dwukrotnie. Pozwól nam się dowiedzieć.
Czy pamiętasz przepływ pracy SED? Domyślnie SED drukuje zawartość bufora wzorców. Ponadto w naszej sekcji poleceń wyraźnie zawarliśmy polecenie drukowania. Dlatego każda linia jest drukowana dwukrotnie. Ale nie martw się. SED ma-nopcja pomijania domyślnego drukowania bufora wzoru. Poniższe polecenie ilustruje to.
[jerry]$ sed -n 'p' 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
Gratulacje! otrzymaliśmy oczekiwany wynik. Domyślnie SED działa na wszystkich liniach. Ale możemy zmusić SED do działania tylko na niektórych liniach. Na przykład w poniższym przykładzie SED działa tylko w trzeciej linii. W tym przykładzie określiliśmy zakres adresów przed poleceniem SED.
[jerry]$ sed -n '3p' books.txt
Wykonanie powyższego kodu da następujący wynik.
3) The Alchemist, Paulo Coelho, 197
Dodatkowo możemy również poinstruować SED, aby drukował tylko określone linie. Na przykład poniższy kod wypisuje wszystkie wiersze od 2 do 5. Tutaj użyliśmy operatora przecinka (,) do określenia zakresu adresów.
[jerry]$ sed -n '2,5 p' books.txt
Wykonanie powyższego kodu da następujący wynik.
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
Istnieje również specjalny znak Dollar ($), który reprezentuje ostatnią linię pliku. Wydrukujmy więc ostatnią linię pliku.
[jerry]$ sed -n '$ p' books.txt
Wykonanie powyższego kodu da następujący wynik.
6) A Game of Thrones, George R. R. Martin, 864
Jednak możemy również użyć znaku dolara ($), aby określić zakres adresów. Poniższy przykład drukuje od linii 3 do ostatniej linii.
[jerry]$ sed -n '3,$ p' books.txt
Wykonanie powyższego kodu da następujący wynik.
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
Dowiedzieliśmy się, jak określić zakres adresów za pomocą operatora przecinka (,). SED obsługuje dwa dodatkowe operatory, których można użyć do określenia zakresu adresów. Pierwszy to operator plus (+) i może być używany z operatorem przecinka (,). Na przykładM, +n wydrukuje następny n linie zaczynające się od numeru linii M. Brzmi myląco? Sprawdźmy to na prostym przykładzie. Poniższy przykład drukuje kolejne 4 wiersze, zaczynając od wiersza numer 2.
[jerry]$ sed -n '2,+4 p' books.txt
Wykonanie powyższego kodu da następujący wynik.
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
Opcjonalnie możemy również określić zakres adresów za pomocą operatora tyldy (~). To używaM~nFormularz. Wskazuje, że SED powinien rozpoczynać się od wiersza o numerze M i przetwarzać co n (tę) linię. Na przykład,50~5dopasowuje wiersz numer 50, 55, 60, 65 i tak dalej. Wydrukujmy tylko nieparzyste linie z pliku.
[jerry]$ sed -n '1~2 p' books.txt
Wykonanie powyższego kodu da następujący wynik.
1) A Storm of Swords, George R. R. Martin, 1216
3) The Alchemist, Paulo Coelho, 197
5) The Pilgrimage, Paulo Coelho, 288
Poniższy kod drukuje tylko parzyste wiersze z pliku.
[jerry]$ sed -n '2~2 p' books.txt
Wykonanie powyższego kodu da następujący wynik.
2) The Two Towers, J. R. R. Tolkien, 352
4) The Fellowship of the Ring, J. R. R. Tolkien, 432
6) A Game of Thrones, George R. R. Martin, 864