Halte es einfach - Schwanz
Wir sollten keinen regulären Ausdruck oder mehr als einen Prozess benötigen, nur um Zeichen zu zählen.
Der Befehl tail
, der häufig zum Anzeigen der letzten Zeilen einer Datei verwendet wird, verfügt über eine option -c
( --bytes
), die genau das richtige Werkzeug dafür zu sein scheint:
$ printf 123456789 | tail -c 3
789
(Wenn Sie sich in einer Shell befinden, ist es sinnvoll, eine Methode wie in der Antwort von mikeserv zu verwenden, da dies das Starten des Prozesses für spart tail
.)
Echte Unicode-Zeichen?
Nun fragen Sie nach den letzten drei Zeichen . Das gibt Ihnen diese Antwort nicht: Sie gibt die letzten drei Bytes aus !
Solange jedes Zeichen ein Byte ist, tail -c
funktioniert es einfach. So ist es verwendet werden kann , wenn der Zeichensatz ist ASCII
, ISO 8859-1
oder eine Variante.
Wenn Sie eine Unicode-Eingabe haben, wie im allgemeinen UTF-8
Format, ist das Ergebnis falsch:
$ printf 123αβγ | tail -c 3
�γ
In diesem Beispiel sind UTF-8
die griechischen Zeichen alpha, beta und gamma mit zwei Bytes lang:
$ printf 123αβγ | wc -c
9
Die Option -m
kann mindestens die echten Unicode-Zeichen zählen:
printf 123αβγ | wc -m
6
Ok, die letzten 6 Bytes geben uns die letzten 3 Zeichen:
$ printf 123αβγ | tail -c 6
αβγ
So tail
bietet keine Unterstützung für allgemeine Zeichen Handhabung und versucht es nicht einmal (siehe unten): Es behandelt variabler Größe Linien, aber keine variable Größe Zeichen.
Sagen wir es so: Es tail
ist genau richtig für die Struktur des Problems, aber falsch für die Art der Daten.
GNU coreutils
Suchen Sie weiter, es stellt sich heraus, der dich GNU coreutils, die Sammlung von grundlegenden Werkzeuge wie sed
, ls
, tail
und cut
ist noch nicht vollständig internationalisiert. Dabei geht es hauptsächlich um die Unterstützung von Unicode.
Wäre zum Beispiel cut
ein guter Kandidat, um hier zur Charakterunterstützung anstelle von Tail zu verwenden. Es gibt Optionen zum Bearbeiten von Bytes oder Zeichen -c
( --bytes
) und -m
( --chars
);
Nur das -m
/ --chars
ist ab Version
cut (GNU coreutils) 8.21
2013
nicht implementiert!
Von 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.
Siehe auch diese Antwort zu Kann nicht `cut -c` (` --characters`) mit UTF-8 verwendet werden? .
grep -o '.\{3\}$'