Edytor strumienia - znaki specjalne
SED udostępnia dwa znaki specjalne, które są traktowane jako polecenia. Ten rozdział ilustruje użycie tych dwóch znaków specjalnych.
= Dowództwo
Polecenie „=” zajmuje się numerami linii. Poniżej podano składnię polecenia „=”:
[/pattern/]=
[address1[,address2]]=
Polecenie = zapisuje numer wiersza, po którym następuje jego zawartość, w standardowym strumieniu wyjściowym. Poniższy przykład ilustruje to.
[jerry]$ sed '=' books.txt
Po wykonaniu powyższego kodu otrzymasz następujący wynik:
1
1) A Storm of Swords, George R. R. Martin, 1216
2
2) The Two Towers, J. R. R. Tolkien, 352
3
3) The Alchemist, Paulo Coelho, 197
4
4) The Fellowship of the Ring, J. R. R. Tolkien, 432
5
5) The Pilgrimage, Paulo Coelho, 288
6
6) A Game of Thrones, George R. R. Martin, 864
Wydrukujmy numery wierszy i zawartość pierwszych czterech wierszy. Następujące polecenie drukuje pierwsze cztery wiersze z numerami wierszy, a pozostałe bez numerów wierszy.
[jerry]$ sed '1, 4=' books.txt
Po wykonaniu powyższego kodu otrzymasz następujący wynik:
1
1) A Storm of Swords, George R. R. Martin, 1216
2
2) The Two Towers, J. R. R. Tolkien, 352
3
3) The Alchemist, Paulo Coelho, 197
4
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
Dodatkowo możemy poinstruować SED, aby wydrukował numery wierszy, gdy dopasowanie wzorca się powiedzie. Poniższy przykład wyświetla numer wiersza zawierający wzorzec „Paulo”.
[jerry]$ sed '/Paulo/ =' books.txt
Po wykonaniu powyższego kodu otrzymasz następujący wynik:
1) A Storm of Swords, George R. R. Martin, 1216
2) The Two Towers, J. R. R. Tolkien, 352
3
3) The Alchemist, Paulo Coelho, 197
4) The Fellowship of the Ring, J. R. R. Tolkien, 432
5
5) The Pilgrimage, Paulo Coelho, 288
6) A Game of Thrones, George R. R. Martin, 864
Czy możesz zgadnąć, co robi następujące polecenie SED?
[jerry]$ sed -n '$ =' books.txt
Po wykonaniu powyższego kodu otrzymasz następujący wynik:
6
Tak masz rację. Zlicza całkowitą liczbę wierszy obecnych w pliku. Pozwól nam zdemistyfikować kod. W sekcji poleceń użyliśmy „$ =”, które wypisuje numer linii ostatniej linii, po której następuje jej zawartość. Ale zapewniliśmy również-n flaga, która wyłącza domyślne drukowanie bufora wzorca. W związku z tym wyświetlany jest tylko numer ostatniego wiersza.
& Komenda
SED obsługuje znaki specjalne &. Zawsze, gdy dopasowanie wzorca powiedzie się, ten znak specjalny przechowuje dopasowany wzorzec. Jest często używany z poleceniem substitution. Zobaczmy, jak możemy wykorzystać tę wydajną funkcję.
Każdy wiersz w pliku book.txt jest ponumerowany. Dodajmy słowaBook numberna początku każdego wiersza. Poniższy przykład ilustruje to.
[jerry]$ sed 's/[[:digit:]]/Book number &/' books.txt
Po wykonaniu powyższego kodu otrzymasz następujący wynik:
Book number 1) A Storm of Swords, George R. R. Martin, 1216
Book number 2) The Two Towers, J. R. R. Tolkien, 352
Book number 3) The Alchemist, Paulo Coelho, 197
Book number 4) The Fellowship of the Ring, J. R. R. Tolkien, 432
Book number 5) The Pilgrimage, Paulo Coelho, 288
Book number 6) A Game of Thrones, George R. R. Martin, 864
Ten przykład jest bardzo prosty. Najpierw wyszukujemy pierwsze wystąpienie cyfry, czyli numer linii (dlatego użyliśmy [[: digit:]]), a SED automatycznie zapisuje dopasowany wzorzec w specjalnym znaku &. W drugim kroku wstawiamy słowaBook number przed każdym dopasowanym wzorem, czyli przed każdym wierszem.
Weźmy inny przykład. W pliku book.txt ostatnia cyfra oznacza liczbę stron książki. Dodajmy wcześniej „Pages =”. Aby to zrobić, znajdź ostatnie wystąpienie cyfry i zamień je na „Strony = &”. Tutaj & przechowuje dopasowany wzorzec, tj. Liczbę stron
[jerry]$ sed 's/[[:digit:]]*$/Pages = &/' books.txt
Wykonując powyższą składnię, otrzymasz następujący wynik:
1) A Storm of Swords, George R. R. Martin, Pages = 1216
2) The Two Towers, J. R. R. Tolkien, Pages = 352
3) The Alchemist, Paulo Coelho, Pages = 197
4) The Fellowship of the Ring, J. R. R. Tolkien, Pages = 432
5) The Pilgrimage, Paulo Coelho,Pages = 288
6) A Game of Thrones, George R. R. Martin, Pages = 864
Na razie tylko o tym pamiętaj [[:digit:]]*$znajduje ostatnie wystąpienie cyfry. W rozdziale „Wyrażenia regularne” dowiemy się więcej o wyrażeniach regularnych.