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 -c
po prostu działa. Dzięki czemu może być używany, jeśli zestaw znaków ASCII
, ISO 8859-1
lub jego wariant.
Jeśli masz wejście Unicode, jak we wspólnym UTF-8
formacie, wynik jest nieprawidłowy:
$ printf 123αβγ | tail -c 3
�γ
W tym przykładzie użycie UTF-8
greckich znaków alfa, beta i gamma ma dwa bajty:
$ printf 123αβγ | wc -c
9
Ta opcja -m
moż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 tail
nie 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: tail
jest 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
, tail
a cut
nie jest jeszcze w pełni umiędzynarodowione. Dotyczy to głównie obsługi Unicode.
Na przykład cut
był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
/ --chars
od wersji
cut (GNU coreutils) 8.21
2013
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\}$'