Сохраняя это простым - хвост
Нам не нужно регулярное выражение или более одного процесса только для подсчета символов.
Команда tail, часто используемая для отображения последних строк файла, имеет параметр -c( --bytes), который, кажется, является подходящим инструментом для этого:
$ printf 123456789 | tail -c 3
789
(Когда вы находитесь в оболочке, имеет смысл использовать метод, как в ответе mikeserv, потому что он экономит запуск процесса для tail.)
Реальные символы Юникода?
Теперь вы просите последние три символа ; Это не то, что дает этот ответ: он выводит последние три байта !
Пока каждый символ - один байт, tail -cпросто работает. Таким образом, он может быть использован, если набор символов ASCII, ISO 8859-1или вариант.
Если у вас есть ввод Unicode, как в обычном UTF-8формате, результат неправильный:
$ printf 123αβγ | tail -c 3
�γ
В этом примере, используя UTF-8греческие символы альфа, бета и гамма длиной два байта:
$ printf 123αβγ | wc -c
9
Опция -mможет по крайней мере подсчитывать реальные символы Юникода:
printf 123αβγ | wc -m
6
Итак, последние 6 байтов дадут нам последние 3 символа:
$ printf 123αβγ | tail -c 6
αβγ
Таким образом, tailон не поддерживает обработку общих символов и даже не пытается (см. Ниже): он обрабатывает строки переменного размера, но не символы переменного размера.
Скажем так: tailэто правильно для структуры проблемы, которую нужно решить, но неправильно для вида данных.
GNU coreutils
Глядя дальше, то получается, что 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.
См. Также этот ответ на Не можете использовать `cut -c` (` --characters`) с UTF-8? ,
grep -o '.\{3\}$'