Сохраняя это простым - хвост
Нам не нужно регулярное выражение или более одного процесса только для подсчета символов.
Команда 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.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.
См. Также этот ответ на Не можете использовать `cut -c` (` --characters`) с UTF-8? ,
grep -o '.\{3\}$'