Trong hệ thống Linux và Unix, tr là tiện ích dòng lệnh dịch chuyển, xóa, và “nén” ký tự lặp lại – thực tế, tr là viết tắt của “translate.” Hướng dẫn này giải thích cách dùng lệnh tr trong Linux, với ví dụ. Nó có thể dùng cho các thao tác như xóa ký tự lặp, chuyển chữ thường thành hoa, và thay thế/xóa ký tự cơ bản. Thường dùng kết hợp với các lệnh khác qua piping.
Linux là kernel/hệ điều hành cốt lõi đằng sau nhiều công nghệ chúng ta dùng hàng ngày, bao gồm Android – nền tảng nhiều người có trên điện thoại. Nó mã nguồn mở và dễ cấu hình.
Cách dùng lệnh tr
Cú pháp chạy lệnh tr như sau, nơi ký tự trong SET1 sẽ được dịch thành ký tự trong SET2:
tr OPTION... SET1 [SET2]
Lệnh tr chấp nhận hai tập ký tự (thường cùng độ dài). Sau đó nó thay thế ký tự từ tập đầu bằng ký tự tương ứng từ tập hai. Trong kịch bản này, một SET là chuỗi ký tự và bao gồm cả ký tự thoát backslash đặc biệt.
Ví dụ
Sử dụng dải ký tự
Bạn cũng có thể dùng dải thay vì lớp ký tự nếu muốn:
echo 'hello' | tr 'a-z' 'A-Z'
Để chuyển đổi ngược lại, chỉ cần đổi chỗ hai tập.
Chuyển đổi chữ hoa/thường
Chuyển chữ hoa thành thường hoặc ngược lại là một trong những trường hợp dùng phổ biến nhất của lệnh tr.
[:lower:] khớp tất cả ký tự thường, và [:upper:] khớp tất cả ký tự hoa.
echo 'Hello' | tr '[:lower:]' '[:upper:]' HELLO
Xóa dòng trống
Để xóa dòng trống, bạn cần “nén” các ký tự newline lặp lại:
tr -s '\n' < input.txt > output.txt
Trong trên, chúng ta dùng ký hiệu chuyển hướng, sau đó ghi output của lệnh vào output.txt.
Xóa tất cả ký tự không phải số
Lệnh sau xóa tất cả ký tự không phải số:
echo "The account number is 10879358" | tr -cd [:digit:]
[:digit:] đại diện cho tất cả ký tự chữ số. Bằng cách dùng tùy chọn -c, lệnh xóa ký tự không phải số. Output tiếp theo sẽ trông như:
10879358
In thư mục $PATH mỗi cái trên một dòng
Biến môi trường $PATH là danh sách thư mục (phân cách bằng dấu hai chấm) báo cho shell thư mục nào tìm file thực thi khi bạn gõ lệnh. Để in mỗi thư mục lên dòng riêng, ta cần khớp dấu hai chấm (:) và thay bằng lệnh xuống dòng:
echo $PATH | tr ':' '\n' /usr/local/sbin /usr/local/bin /usr/sbin /usr/bin /sbin /bin /usr/games /usr/local/games /snap/bin
Đặt mỗi từ trên một dòng
Để làm này, ta cần khớp tất cả ký tự (không phải chữ số) và thay bằng xuống dòng:
echo 'Linux is the best operating system in the world' | tr -cs '[:alnum:]'
Output là:
Linux is the best operating system in the world
Thay thế ký tự
Nếu muốn thay thế ký tự từ standard input (‘coding’) với các ký tự tương ứng của tập hai.
echo 'coding' | tr 'co' 'hi'
Mỗi lần xuất hiện “c” được thay bằng “h”, và “o” bằng “i” với kết quả:
hiding
Tập ký tự cũng có thể định nghĩa dùng dải ký tự. Ví dụ, thay vì viết:
echo 'coding' | tr 'abcd' 'wxyz'
bạn có thể dùng:
echo 'coding' | tr 'a-d' 'w-z' yozing
Khi tùy chọn -c dùng, tr thay thế tất cả ký tự KHÔNG trong SET1.
Trong ví dụ sau, tất cả ký tự trừ “li” sẽ được thay bằng ký tự cuối từ tập hai:
$ echo 'coding' | tr -c 'cod' 'xy' liyyyiyyy
Để echo chuỗi không có dòng mới, dùng tùy chọn -n.
Tùy chọn -d bảo tr xóa ký tự chỉ định trong SET1. Khi bạn muốn làm này mà không nén, bạn nên chỉ định chỉ một tập.
Lệnh dưới sẽ xóa ký tự l, I, và z:
echo 'Linuxize' | tr -d 'liz'