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 -c
apenas funciona. Então, ele pode ser usado se o conjunto de caracteres é ASCII
, ISO 8859-1
ou uma variante.
Se você tiver entrada Unicode, como no UTF-8
formato 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 -m
pode 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, tail
ele 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
, tail
e cut
, ainda não está totalmente internacionalizado. O que é principalmente sobre o suporte ao Unicode.
Por exemplo, cut
seria 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
/ --chars
na versão
cut (GNU coreutils) 8.21
2013
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\}$'