Đúng. Bạn có thể làm điều đó với tr
ngôn ngữ ASCII ( tr
dù sao, đối với GNU , đây là loại nội dung duy nhất của nó) . Bạn có thể sử dụng các lớp POSIX hoặc bạn có thể tham chiếu các giá trị byte của mỗi ký tự theo số bát phân. Bạn cũng có thể phân chia các biến đổi của chúng trên các phạm vi.
LC_ALL=C tr '[:upper:]\0-\101\133-140\173-\377' '[:lower:][\n*]' <input
Lệnh trên sẽ chuyển đổi tất cả các ký tự chữ hoa thành chữ thường, bỏ qua toàn bộ ký tự chữ thường và chuyển đổi tất cả các ký tự khác thành dòng mới. Tất nhiên, sau đó bạn kết thúc với một tấn các dòng trống. Các tr
-s
lặp queeze chuyển có thể hữu ích trong trường hợp đó, nhưng nếu bạn sử dụng nó bên cạnh [:upper:]
để [:lower:]
chuyển đổi sau đó bạn gió lên ép ký tự chữ hoa là tốt. Theo cách đó, nó vẫn yêu cầu bộ lọc thứ hai như ...
LC... tr ... | tr -s \\n
...hoặc là...
LC... tr ... | grep .
... và do đó, nó trở nên ít thuận tiện hơn nhiều so với làm ...
LC_ALL=C tr -sc '[:alpha:]' \\n <input | tr '[:upper:]' '[:lower:]'
... Việc nén các -c
ký tự chữ cái theo trình tự thành một dòng mới một mảnh, sau đó thực hiện chuyển đổi từ trên xuống dưới ở phía bên kia của đường ống.
Điều đó không có nghĩa là phạm vi của bản chất đó không hữu ích. Những thứ như:
tr '\0-\377' '[1*25][2*25][3*25][4*25][5*25][6*25][7*25][8*25][9*25][0*]' </dev/random
... có thể khá tiện dụng vì nó chuyển đổi các byte đầu vào thành tất cả các chữ số trên một phổ trải rộng các giá trị của chúng. Lãng phí không, muốn không, bạn biết.
Một cách khác để làm biến đổi có thể liên quan dd
.
tr '\0-\377' '[A*64][B*64][C*64][D*64]' </dev/urandom |
dd bs=32 cbs=8 conv=unblock,lcase count=1
dadbbdbd
ddaaddab
ddbadbaa
bdbdcadd
Bởi vì dd
có thể thực hiện cả hai unblock
và lcase
chuyển đổi cùng một lúc, thậm chí có thể chuyển phần lớn công việc cho nó. Nhưng điều đó chỉ thực sự hữu ích nếu bạn có thể dự đoán chính xác số byte trên mỗi từ - hoặc ít nhất có thể đệm từng từ với khoảng trắng trước một số byte có thể dự đoán được, bởi vì unblock
ăn các khoảng trắng ở cuối mỗi khối.