Prostota - ogon
Nie powinniśmy potrzebować wyrażenia regularnego ani więcej niż jednego procesu, aby policzyć znaki.
Polecenie tail, często używane do wyświetlania ostatnich linii pliku, ma opcję -c( --bytes), która wydaje się być właściwym narzędziem do tego:
$ printf 123456789 | tail -c 3
789
(Gdy jesteś w powłoce, sensowne jest użycie metody takiej jak w odpowiedzi mikeserv, ponieważ oszczędza to rozpoczęcia procesu tail.)
Prawdziwe znaki Unicode?
Teraz pytasz o ostatnie trzy postacie ; Nie to daje ci ta odpowiedź: wyświetla trzy ostatnie bajty !
Tak długo, jak każdy znak ma jeden bajt, tail -cpo prostu działa. Dzięki czemu może być używany, jeśli zestaw znaków ASCII, ISO 8859-1lub jego wariant.
Jeśli masz wejście Unicode, jak we wspólnym UTF-8formacie, wynik jest nieprawidłowy:
$ printf 123αβγ | tail -c 3
�γ
W tym przykładzie użycie UTF-8greckich znaków alfa, beta i gamma ma dwa bajty:
$ printf 123αβγ | wc -c
9
Ta opcja -mmoże przynajmniej liczyć prawdziwe znaki Unicode:
printf 123αβγ | wc -m
6
Ok, więc ostatnie 6 bajtów da nam ostatnie 3 znaki:
$ printf 123αβγ | tail -c 6
αβγ
Więc tailnie obsługuje przenoszenia ogólne znaki, i to nawet nie próbować (patrz poniżej): Obsługuje linie zmienne wielkości, ale nie ma znaków o zmiennej wielkości.
Ujmijmy to w następujący sposób: tailjest odpowiedni dla struktury problemu do rozwiązania, ale zły dla rodzaju danych.
Coreutils GNU
Patrząc dalej, okazuje się, że thee coreutils GNU zbiór podstawowych narzędzi podoba sed, ls, taila cutnie jest jeszcze w pełni umiędzynarodowione. Dotyczy to głównie obsługi Unicode.
Na przykład cutbyłby dobrym kandydatem do użycia zamiast ogona tutaj do wspierania postaci; Ma opcje pracy na bajtach lub znakach, -c( --bytes) i -m( --chars);
Tyle, że -m/ --charsod wersji
cut (GNU coreutils) 8.212013
nie jest zaimplementowany!
Od info cut:
`-c CHARACTER-LIST'
`--characters=CHARACTER-LIST'
Select for printing only the characters in positions listed in CHARACTER-LIST.
The same as `-b' for now, but internationalization will change that.
Zobacz także tę odpowiedź na Nie możesz używać `cut -c` (` --characters`) z UTF-8? .
grep -o '.\{3\}$'