Rester simple - queue
Nous ne devons pas avoir besoin d'une expression régulière, ni de plusieurs processus, juste pour compter les caractères.
La commande tail
, souvent utilisée pour afficher les dernières lignes d'un fichier, a une option -c
( --bytes
), qui semble être juste le bon outil pour cela:
$ printf 123456789 | tail -c 3
789
(Lorsque vous êtes dans un shell, il est logique d'utiliser une méthode comme dans la réponse de mikeserv, car cela évite de démarrer le processus pour tail
.)
De vrais personnages Unicode?
Maintenant, vous demandez les trois derniers caractères ; Ce n'est pas ce que cette réponse vous donne: elle sort les trois derniers octets !
Tant que chaque caractère est un octet, tail -c
ça fonctionne. Il peut donc être utilisé si le jeu de caractères est ASCII
, ISO 8859-1
ou une variante.
Si vous avez une entrée Unicode, comme dans le UTF-8
format commun , le résultat est incorrect:
$ printf 123αβγ | tail -c 3
�γ
Dans cet exemple, en utilisant UTF-8
, les caractères grecs alpha, bêta et gamma ont une longueur de deux octets:
$ printf 123αβγ | wc -c
9
L'option -m
peut au moins compter les vrais caractères unicode:
printf 123αβγ | wc -m
6
Ok, donc les 6 derniers octets nous donneront les 3 derniers caractères:
$ printf 123αβγ | tail -c 6
αβγ
Donc, tail
ne prend pas en charge la gestion des caractères généraux, et il n'essaie même pas (voir ci-dessous): il gère les lignes de taille variable, mais pas les caractères de taille variable.
Disons-le de cette façon: tail
est juste pour la structure du problème à résoudre, mais pas pour le type de données.
GNU coreutils
Au -delà, il se trouve que Thee coreutils GNU, la collection d'outils de base comme sed
, ls
, tail
et cut
, ne sont pas encore totalement internationalisé. Il s'agit principalement de prendre en charge Unicode.
Par exemple, cut
serait un bon candidat à utiliser au lieu de queue ici pour le support des personnages; Il a des options pour travailler sur les octets ou les caractères, -c
( --bytes
) et -m
(--chars
);
Seul ce -m
/ --chars
n'est, à partir de la version
cut (GNU coreutils) 8.21
, 2013,
pas implémenté!
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.
Voir aussi cette réponse à Vous ne pouvez pas utiliser `cut -c` (` --characters`) avec UTF-8? .
grep -o '.\{3\}$'