Да. Вы можете сделать это с tr
помощью локали ASCII (которая в tr
любом случае является для GNU своего рода единственной задачей) . Вы можете использовать классы POSIX или ссылаться на байтовые значения каждого символа по восьмеричному числу. Вы также можете разделить их преобразования по диапазонам.
LC_ALL=C tr '[:upper:]\0-\101\133-140\173-\377' '[:lower:][\n*]' <input
Приведенная выше команда преобразует все заглавные буквы в строчные, полностью игнорирует строчные буквы и преобразует все остальные символы в символы новой строки. Конечно, тогда вы получите тонны пустых строк. Переключатель tr
-s
queeze 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
съедает конечные пробелы в конце каждого блока.