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