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 -chanya berfungsi. Jadi itu bisa digunakan jika set karakternya adalah ASCII, ISO 8859-1atau varian.
Jika Anda memiliki input Unicode, seperti dalam UTF-8format 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 -msetidaknya 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, tailtidak 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: tailtepat 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, taildan cut, belum sepenuhnya internasionalisasi. Yang terutama tentang mendukung Unicode.
Misalnya, cutakan 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/ --charsadalah, sebagai versi
cut (GNU coreutils) 8.212013,
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\}$'