Зберігаючи це просто - хвіст
Нам не потрібен регулярний вираз або більше ніж один процес, аби тільки порахувати символи.
Команда 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.212013 року
не реалізовано!
Від 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\}$'