Зберігаючи це просто - хвіст
Нам не потрібен регулярний вираз або більше ніж один процес, аби тільки порахувати символи.
Команда tail
, яка часто використовується для показу останніх рядків файлу, має опцію -c
( --bytes
), яка, здається, є лише правильним інструментом для цього:
$ printf 123456789 | tail -c 3
789
(Коли ви знаходитесь в оболонці, є сенс використовувати метод, як у відповіді mikeserv, оскільки це економить запуск процесу для tail
.)
Справжні символи Unicode?
Тепер ви запитаєте останні три символи ; Це не те, що дає ця відповідь: вона виводить три останні байти !
Поки кожен символ є одним байтом, він tail -c
просто працює. Тому його можна використовувати, якщо набір символів є ASCII
, ISO 8859-1
або варіант.
Якщо у вас є введення Unicode, як у загальному UTF-8
форматі, результат неправильний:
$ printf 123αβγ | tail -c 3
�γ
У цьому прикладі з використанням UTF-8
грецьких символів альфа, бета та гама є двома байтами:
$ printf 123αβγ | wc -c
9
Параметр -m
може принаймні рахувати реальних символів unicode:
printf 123αβγ | wc -m
6
Добре, тож останні 6 байт дадуть нам останні три символи:
$ printf 123αβγ | tail -c 6
αβγ
Отже, tail
не підтримує обробку загальних символів і навіть не намагається (див. Нижче): Він обробляє лінії змінного розміру, але не містить символів змінного розміру.
Поставимо це так: tail
підходить для вирішення структури проблеми, але неправильно для типу даних.
Основні елементи GNU
Дивлячись далі, то виходить, що Thee Coreutils GNU, сукупність основних інструментів , таких як sed
, ls
, tail
і cut
, ще не в повній мірі інтернаціоналізації. Що стосується переважно підтримки Unicode.
Наприклад, cut
було б хорошим кандидатом використовувати замість хвоста тут для підтримки персонажів; У нього є варіанти роботи над байтами або знаками, -c
( --bytes
) і -m
( --chars
);
Тільки це -m
/ --chars
станом на версію
cut (GNU coreutils) 8.21
2013 року
не реалізовано!
Від 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.
Дивіться також цей відповідь , щоб не можете використовувати `вирізати -c` (` --characters`) з UTF-8? .
grep -o '.\{3\}$'