Chuyện gì đang xảy ra
Shell (bash) thấy đối số [a-z]
. Đó là mẫu ký tự đại diện (hình cầu ), khớp với bất kỳ chữ cái viết thường nào. Do đó, shell tìm kiếm một tên tệp phù hợp với mẫu này. Có ba trường hợp:
- Không có tệp nào trong thư mục hiện tại có tên là một chữ cái viết thường. Sau đó, vỏ để lại mẫu ký tự đại diện không thay đổi, và
tr
thấy các đối số -d
và [a-z]
. Đây là những gì xảy ra trên hầu hết các máy của bạn.
- Một tập tin trong thư mục hiện tại có một tên là một chữ cái viết thường. Sau đó, shell mở rộng mẫu cho tên tệp này và
tr
xem các đối số -d
và tên tệp. Điều này xảy ra trên máy chủ và tệp phù hợp được gọi o
vì chúng ta có thể thấy rằng tr
đã xóa chữ cái o
.
- Hai hoặc nhiều tệp trong thư mục hiện tại có một tên là một chữ cái viết thường. Sau đó, shell mở rộng mẫu vào danh sách các tên tệp phù hợp và
tr
thấy ba hoặc nhiều đối số: -d
và tên tệp. Vì tr
mong đợi một cuộc tranh cãi duy nhất sau -d
đó, nó sẽ phàn nàn.
Những gì bạn nên làm
Nếu có các ký tự đặc biệt trong đối số của lệnh, bạn phải thoát chúng. Đặt đối số trong dấu ngoặc đơn '…'
(đây là cách đơn giản nhất, có những cách khác). Bên trong các trích dẫn đơn, tất cả các ký tự đứng cho chính họ ngoại trừ chính trích dẫn đó. Nếu có một trích dẫn bên trong đối số, thay thế nó bằng'\''
.
tr -d '[a-z]'
Tuy nhiên lưu ý rằng đây có lẽ vẫn không phải là ý bạn! Điều này nói tr
để xóa các chữ cái viết thường và dấu ngoặc vuông. Nó tương đương với tr -d ']a-z['
, tr '[]a-z'
v.v. Để xóa các chữ cái thường, hãy sử dụng
tr -d a-z
Đối số tr
là một bộ ký tự. Bạn đặt dấu ngoặc quanh một bộ ký tự trong một biểu thức thông thường hoặc mẫu ký tự đại diện để chỉ ra rằng đó là một bộ ký tự. Nhưng tr
hoạt động trên một nhân vật tại một thời điểm. Đối số dòng lệnh của nó là những gì bạn đặt trong dấu ngoặc .
Bạn cần dấu ngoặc để chỉ các lớp ký tự . Trong một biểu thức thông thường, bạn sử dụng dấu ngoặc trong ngoặc để biểu thị một lớp ký tự, ví dụ: [[:lower:]]*
khớp với bất kỳ số chữ cái viết thường nào, [[:lower:]_]*
khớp với bất kỳ số lượng chữ cái viết thường và dấu gạch dưới. Trong đối số của tr
, bạn cần tập hợp không có dấu ngoặc xung quanh, vì vậy tr -d '[:lower:]'
xóa các chữ cái viết thường, tr -d '[:lower:]_'
xóa các chữ cái thường và dấu gạch dưới, v.v.
¹ Trong một số miền địa phương nó có thể phù hợp với các nhân vật khác .
tr
phạm vi được viết mà không kèm theo[...]
. Vì vậy,tr -d '[a-z]'
sẽ giếta-z
, và nhân vật[
và]
. Sử dụngtr -d a-z
để chỉ giết các chữ cáia-z
.