Basit tutmak - kuyruk
Sadece karakterleri saymak için düzenli bir ifadeye veya birden fazla işleme ihtiyacımız olmamalıdır. Genellikle bir dosyanın son satırlarını göstermek için kullanılan
komut tail
, bunun için doğru araç gibi görünen bir seçeneğe ( ) sahiptir :-c
--bytes
$ printf 123456789 | tail -c 3
789
(Bir kabuğun içindeyken, mikeserv'in yanıtında olduğu gibi bir yöntem kullanmak mantıklıdır, çünkü işlemi başlatmak için tasarruf sağlar tail
.)
Gerçek Unicode karakterler?
Şimdi son üç karakteri soruyorsunuz ; Bu cevabın size verdiği şey bu değil: son üç baytı çıktı !
Her karakter bir bayt olduğu sürece tail -c
çalışır. O kullanılan olabilir Yani karakter kümesi ise ASCII
, ISO 8859-1
ya da bir çeşit.
Unicode girişiniz varsa, ortak UTF-8
formatta olduğu gibi, sonuç yanlıştır:
$ printf 123αβγ | tail -c 3
�γ
Bu örnekte, kullanılarak UTF-8
yunan karakterleri alfa, beta ve gama iki bayttır:
$ printf 123αβγ | wc -c
9
Bu seçenek -m
en azından gerçek unicode karakterleri sayabilir:
printf 123αβγ | wc -m
6
Tamam, yani son 6 bayt bize son 3 karakteri verecek:
$ printf 123αβγ | tail -c 6
αβγ
Dolayısıyla, tail
genel karakterlerin kullanılmasını desteklemiyor ve hatta denemiyor bile (aşağıya bakın): Değişken boyut satırlarını işler, ancak değişken boyut karakterleri kullanmaz.
Bunu şu şekilde koyalım: tail
sorunun yapısının çözmesi için doğru, ancak veri türünde yanlış.
GNU coreutils
Ayrıca baktığımızda, sana GNU coreutils, temel araçları koleksiyonu gibi çıkıyor sed
, ls
, tail
ve cut
, henüz tam uluslararasılaştırıldı değildir. Genelde Unicode'u desteklemekle ilgili.
Örneğin, cut
burada karakter desteği için kuyruk yerine kullanmak için iyi bir aday olacaktır; Bayt veya karakterlerde çalışmak için seçeneklere sahiptir, -c
( --bytes
) ve -m
( --chars
);
Ancak bundan -m
/ --chars
sürüm itibariyle edilir
cut (GNU coreutils) 8.21
2013,
uygulanmadı!
Kimden 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.
Ayrıca bakınız bu cevabı için Can'ın UTF-8 ile `kesme -c` (` --characters`) kullanılmasın? .
grep -o '.\{3\}$'