Giữ cho nó đơn giản - đuôi
Chúng ta không cần một biểu thức chính quy, hoặc nhiều hơn một quá trình, chỉ để đếm các ký tự.
Lệnh tail
, thường được sử dụng để hiển thị các dòng cuối cùng của tệp, có một tùy chọn -c
( --bytes
), dường như chỉ là công cụ phù hợp cho việc này:
$ printf 123456789 | tail -c 3
789
(Khi bạn ở trong một vỏ, sẽ hợp lý khi sử dụng một phương thức như trong câu trả lời của mikeerv, vì nó tiết kiệm bắt đầu quá trình cho tail
.)
Ký tự Unicode thực sự?
Bây giờ, bạn yêu cầu ba ký tự cuối cùng ; Đó không phải là những gì câu trả lời này mang lại cho bạn: nó tạo ra ba byte cuối cùng !
Miễn là mỗi ký tự là một byte, tail -c
chỉ cần hoạt động. Vì vậy, nó có thể được sử dụng nếu bộ ký tự là ASCII
, ISO 8859-1
hoặc một biến thể.
Nếu bạn có đầu vào Unicode, như trong UTF-8
định dạng phổ biến , kết quả là sai:
$ printf 123αβγ | tail -c 3
�γ
Trong ví dụ này, sử dụng UTF-8
, các ký tự Hy Lạp alpha, beta và gamma dài hai byte:
$ printf 123αβγ | wc -c
9
Tùy chọn -m
ít nhất có thể đếm các ký tự unicode thực:
printf 123αβγ | wc -m
6
Ok, vì vậy 6 byte cuối cùng sẽ cung cấp cho chúng ta 3 ký tự cuối cùng:
$ printf 123αβγ | tail -c 6
αβγ
Vì vậy, tail
không hỗ trợ xử lý các ký tự chung và thậm chí không thử (xem bên dưới): Nó xử lý các dòng kích thước thay đổi, nhưng không có ký tự kích thước thay đổi.
Chúng ta hãy giải thích theo cách này: tail
đúng với cấu trúc của vấn đề cần giải quyết, nhưng sai đối với loại dữ liệu.
GNU coreutils
Nhìn xa hơn, nó chỉ ra rằng ngươi coreutils GNU, bộ sưu tập các công cụ cơ bản như sed
, ls
, tail
và cut
, không được quốc tế hóa chưa đầy đủ. Mà chủ yếu là về hỗ trợ Unicode.
Ví dụ, cut
sẽ là một ứng cử viên tốt để sử dụng thay vì đuôi ở đây để hỗ trợ nhân vật; Nó có các tùy chọn để làm việc trên byte hoặc ký tự, -c
( --bytes
) và -m
( --chars
);
Duy nhất mà -m
/ --chars
là, như các phiên bản
cut (GNU coreutils) 8.21
năm 2013,
không được thực hiện!
Từ 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.
Xem thêm câu trả lời này để Không thể sử dụng `cut -c` (` --char character`) với UTF-8? .
grep -o '.\{3\}$'