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-1ya da bir çeşit.
Unicode girişiniz varsa, ortak UTF-8formatta olduğu gibi, sonuç yanlıştır:
$ printf 123αβγ | tail -c 3
�γ
Bu örnekte, kullanılarak UTF-8yunan karakterleri alfa, beta ve gama iki bayttır:
$ printf 123αβγ | wc -c
9
Bu seçenek -men 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, tailgenel 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: tailsorunun 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, tailve cut, henüz tam uluslararasılaştırıldı değildir. Genelde Unicode'u desteklemekle ilgili.
Örneğin, cutburada 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/ --charssürüm itibariyle edilir
cut (GNU coreutils) 8.212013,
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\}$'