Да. Вы можете сделать это с trпомощью локали ASCII (которая в trлюбом случае является для GNU своего рода единственной задачей) . Вы можете использовать классы POSIX или ссылаться на байтовые значения каждого символа по восьмеричному числу. Вы также можете разделить их преобразования по диапазонам.
LC_ALL=C tr '[:upper:]\0-\101\133-140\173-\377' '[:lower:][\n*]' <input
Приведенная выше команда преобразует все заглавные буквы в строчные, полностью игнорирует строчные буквы и преобразует все остальные символы в символы новой строки. Конечно, тогда вы получите тонны пустых строк. Переключатель tr -squeeze repeat может быть полезен в этом случае, но если вы используете его вместе [:upper:]с [:lower:]преобразованием to, то вы также сжимаете заглавные буквы. Таким образом, он все еще требует второго фильтра, как ...
LC... tr ... | tr -s \\n
...или...
LC... tr ... | grep .
... и так получается гораздо менее удобно, чем делать ...
LC_ALL=C tr -sc '[:alpha:]' \\n <input | tr '[:upper:]' '[:lower:]'
... который сжимает -cпоследовательность алфавитных символов по порядку в одну новую строку, а затем выполняет преобразование сверху вниз на другой стороне трубы.
Нельзя сказать, что диапазоны такого рода бесполезны. Вещи как:
tr '\0-\377' '[1*25][2*25][3*25][4*25][5*25][6*25][7*25][8*25][9*25][0*]' </dev/random
... может быть очень удобно, так как он преобразует входные байты во все цифры по расширенному спектру их значений. Не тратьте, не хотите, вы знаете.
Другой способ сделать преобразование может включать 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
Поскольку ddможно одновременно выполнять преобразования unblockи lcaseпреобразования, возможно, даже удастся передать большую часть работы. Но это может быть действительно полезным, только если вы можете точно предсказать количество байтов на слово - или, по крайней мере, можете заранее заполнить каждое слово пробелами до предсказуемого количества байтов, потому что unblockсъедает конечные пробелы в конце каждого блока.