Mantê-lo 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, tem 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 ele salva o início do processo para tail
.)
Caracteres Unicode reais?
Agora, você pergunta pelos três últimos caracteres ; Não é isso que esta resposta lhe dá: ela produz os três últimos bytes !
Desde que cada caractere seja um byte, tail -c
apenas funciona. Por isso, pode ser usado se o conjunto de caracteres for ASCII
, ISO 8859-1
ou uma variante.
Se você tiver uma entrada em Unicode, como no formato comum UTF-8
, o resultado está errado:
$ printf 123αβγ | tail -c 3
�γ
Neste exemplo, usando UTF-8
, os caracteres grego 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 reais do unicode:
printf 123αβγ | wc -m
6
Ok, os últimos 6 bytes nos fornecerão os 3 últimos caracteres:
$ printf 123αβγ | tail -c 6
αβγ
Portanto, tail
não suporta o tratamento de caracteres gerais e nem mesmo tenta (veja abaixo): Ele lida com linhas de tamanho variável, mas sem caracteres de tamanho variável.
Vamos colocar desta forma: tail
é o ideal para a estrutura do problema a ser resolvido, mas errado para o tipo de dados.
GNU coreutils
Olhando mais adiante, verifica-se que o GNU coreutils, a coleção de ferramentas básicas como sed
, ls
, tail
e cut
, ainda não está totalmente internacionalizada. Qual é principalmente sobre o suporte a Unicode.
Por exemplo, cut
seria um bom candidato para usar em vez de cauda aqui para suporte de caracteres; Ele tem opções para trabalhar em bytes ou caracteres, -c
( --bytes
) e -m
( --chars
);
Só que -m
/ --chars
é, a partir da versão
cut (GNU coreutils) 8.21
, 2013,
não 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 .