Mantendo-o simples - cauda
Não devemos precisar de uma expressão regular, ou mais de um processo, apenas para contar caracteres.
O comando tail, geralmente usado para mostrar as últimas linhas de um arquivo, possui uma opção -c( --bytes), que parece ser a ferramenta certa para isso:
$ printf 123456789 | tail -c 3
789
(Quando você está em um shell, faz sentido usar um método como na resposta do mikeserv, porque economiza o início do processo tail.)
Caracteres Unicode reais?
Agora, você pede os três últimos caracteres ; Não é isso que esta resposta lhe dá: ela gera os últimos três bytes !
Contanto que cada caractere tenha um byte, tail -capenas funciona. Então, ele pode ser usado se o conjunto de caracteres é ASCII, ISO 8859-1ou uma variante.
Se você tiver entrada Unicode, como no UTF-8formato comum , o resultado está errado:
$ printf 123αβγ | tail -c 3
�γ
Neste exemplo, usando UTF-8, os caracteres gregos alfa, beta e gama têm dois bytes de comprimento:
$ printf 123αβγ | wc -c
9
A opção -mpode pelo menos contar os caracteres unicode reais:
printf 123αβγ | wc -m
6
Ok, então os últimos 6 bytes nos fornecerão os últimos 3 caracteres:
$ printf 123αβγ | tail -c 6
αβγ
Portanto, tailele não suporta manipulação de caracteres gerais e nem tenta (veja abaixo): Ele lida com linhas de tamanho variável, mas sem caracteres de tamanho variável.
Vamos colocar desta maneira: tailé ideal para a estrutura do problema resolver, mas errado para o tipo de dados.
GNU coreutils
Olhando mais, verifica-se que te coreutils GNU, a coleção de ferramentas básicas, como sed, ls, taile cut, ainda não está totalmente internacionalizado. O que é principalmente sobre o suporte ao Unicode.
Por exemplo, cutseria um bom candidato para usar em vez de cauda aqui para suporte ao personagem; Possui opções para trabalhar em bytes ou caracteres, -c( --bytes) e -m( --chars);
Somente isso -m/ --charsna versão
cut (GNU coreutils) 8.212013
não foi implementado!
De 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.
Veja também esta resposta para Não é possível usar `cut -c` (` --characters`) com UTF-8? .
grep -o '.\{3\}$'