Menjaga agar tetap sederhana - ekor
Kita tidak perlu ekspresi reguler, atau lebih dari satu proses, hanya untuk menghitung karakter.
Perintah tail
, yang sering digunakan untuk menampilkan baris terakhir file, memiliki opsi -c
( --bytes
), yang tampaknya menjadi alat yang tepat untuk ini:
$ printf 123456789 | tail -c 3
789
(Ketika Anda berada di shell, masuk akal untuk menggunakan metode seperti dalam jawaban mikeserv, karena menyimpan memulai proses untuk tail
.)
Karakter Unicode sungguhan?
Sekarang, Anda meminta tiga karakter terakhir ; Bukan itu yang diberikan jawaban ini: menghasilkan tiga byte terakhir !
Selama setiap karakter adalah satu byte, tail -c
hanya berfungsi. Jadi itu bisa digunakan jika set karakternya adalah ASCII
, ISO 8859-1
atau varian.
Jika Anda memiliki input Unicode, seperti dalam UTF-8
format umum , hasilnya salah:
$ printf 123αβγ | tail -c 3
�γ
Dalam contoh ini, menggunakan UTF-8
, karakter yunani alfa, beta dan gamma panjangnya dua byte:
$ printf 123αβγ | wc -c
9
Opsi -m
setidaknya dapat menghitung karakter unicode yang sebenarnya:
printf 123αβγ | wc -m
6
Ok, jadi 6 byte terakhir akan memberi kita 3 karakter terakhir:
$ printf 123αβγ | tail -c 6
αβγ
Jadi, tail
tidak mendukung penanganan karakter umum, dan bahkan tidak mencoba (lihat di bawah): Ini menangani garis ukuran variabel, tetapi tidak ada karakter ukuran variabel.
Mari kita begini: tail
tepat untuk struktur masalah untuk dipecahkan, tetapi salah untuk jenis data.
GNU coreutils
Melihat lebih jauh, ternyata engkau coreutils GNU, koleksi alat dasar seperti sed
, ls
, tail
dan cut
, belum sepenuhnya internasionalisasi. Yang terutama tentang mendukung Unicode.
Misalnya, cut
akan menjadi kandidat yang baik untuk digunakan alih-alih mengikuti di sini untuk dukungan karakter; Itu memang memiliki opsi untuk bekerja pada byte atau karakter, -c
( --bytes
) dan -m
( --chars
);
Hanya itu -m
/ --chars
adalah, sebagai versi
cut (GNU coreutils) 8.21
2013,
tidak dilaksanakan!
Dari 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.
Lihat juga jawaban ini untuk Tidak dapat menggunakan `cut -c` (` --characters`) dengan UTF-8? .
grep -o '.\{3\}$'