Функція транслітерації та шифрування тексту. Приклади використання функції обміну інформацією між робочим та допоміжним буферами

Транслітерація застосовується для спрощення друкарського набору або для заміни маловідомого алфавіту відомим. Транслітеруванню піддаються географічні назви та інші власні назви, терміни, що набули міжнародного визнання. При їх перенесенні з мови в мову бажано дотримуватися точності або в збереженні буквеного образу топоніма чи власного імені, або у відтворенні звучання. Зумовлене це тим, що жоден з існуючих алфавітів не забезпечує повної відповідності між написанням і вимовою. Не становлять у цьому винятків і топоніми та власні назви. Тому їх транслітерування можна здійснювати або за читанням букв, або за їх вимовою, прийнятою у мові-оригіналі. Це й зумовило застосування двох принципів передачі власних назв: перше — побуквене відтворення, друге — записування звучання слова без уваги на його буквенне оформлення у мові-оригіналі.

Синтаксис: tr/list1/list2/modifiers

y/list1/list2/modifiers

Транслитерация состоит в замене всех символов из списка list1 соответствующими символами из списка list2. Она возвращает количество замененных или удаленных символов. Списки должны состоять из отдельных символов и/или диапазонов вида a-z. Преобразуемая строка задается левым операндом операции =~ или !~. Она должна быть скалярной переменной, элементом массива или элементом ассоциативного массива, например:

$test = 'ABCDEabcde';

$test =~ tr/A-Z/a-z/; # замена строчных букв на прописные

Если строка не задана, то операция подстановки производится над специальной переменной $_. В частности, предыдущий пример можно переписать так:

$_ = 'ABCDEabcde';

tr/A-Z/a-z/;

Мы можем использовать вместо // любой символ, допустимый в q-операциях. Если list1 заключен в парные скобки, то list2 должен иметь собственную пару ограничителей, например tr(A-Z)[a-z] или tr<A-Z>/a-z/.

Обычно эта операция называется tr. Синоним y введен для фанатиков редактора sed и используется только ими. Транслитерация поддерживает следующие модификаторы:

Обычно эта операция называется tr. Синоним y введен для фанатиков редактора sed и используется только ими. Транслитерация поддерживает следующие модификаторы:

Модификатор Описание
c Заменять символы, не входящие в list1.
d Удалять символы, для которых нет замены.
s Удалять повторяющиеся символы при замене.
U Преобразовывать в/из кодировку UTF-8.
C Преобразовывать в/из однобайтовую кодировку.

Модификатор c вызывает транслитерацию всех символов, не входящих в список list1. Например, операция tr/a-zA-Z/ /c заменит все символы, не являющиеся латинскими буквами, на пробелы.

По умолчанию, если list2 короче, чем list1, он дополняется последним своим символом, а если он пуст, то принимается равным list1 (это удобно для подсчета количества символов определенного класса в строке). Модификатор d изменяет эти правила: все символы из list1, которым нет соответствия в list2, удаляются из строки. Например, операция tr/a-zA-Z//cd удалит из строки все символы, не являющиеся латинскими буквами.

sed использует два буфера для обработки вводного потока: основной буфер обработки (PATTERN BUFFER) и дополнительный буфер (HOLD BUFFER). В обычном режиме sedчитает строки вводного потока и помещает из в основной буфер; там же производятся операции редактирования. дополнительный буфер изначально пуст, но ряд команд позволяют перемещать данные из одного буфера в другой.

Модификатор s удаляет повторы: если несколько символов подряд заменились на один и тот же символ, то будет оставлено только один экземпляр этого символа. Например, операция tr/ / /sудаляет в строке повторяющиеся пробелы.

Модификаторы C и U предназначены для перекодировки символов из системной кодировки в UTF-8 и обратно. Первый из них указывает на исходную кодировку, а второй — на кодировку результата. Например, tr/\0-\xFF//CU перекодирует строку из системной кодировки в UTF-8, аtr/\0-\xFF//UC выполнит обратную перекодировку.

Транслитерация производится без интерполяции списков символов, поэтому для использования в ней переменных необходимо вызвать функцию eval(), например:

eval "tr/$oldlist/$newlist/";

Цикл выполнения

sed работает с двумя буферами данных: основным и вспомогательным. Изначально оба буфера пусты.
Работа с этими буферами осуществляется при помощи команд:\`h', `H', `x', `g', `G' `D' h - Заменить содержимое вспомогательного буфера содержимым основного
H - Добавить новую строку к вспомогательному буферу и затем добавить содержимое основного буфера к содержимому вспомогательного
x - Поменять содержимое обоих буферов местами
g - Заменить содержимое основного буфера содержимым вспомогательного
G - Добавить новую строку к основному буферу и затем добавить содержимое вспомогательного буфера к содержимому основного
D - Удалить текст основного буфера до следующего символа перевода строки
N - Добавить новую строку к основному буферу, затем добавить туда следующую обрабатываемую строку
P - Вывести содержимое основного буфера до следующего символа перевода строки

Здесь обсуждаются команды sed, которые тоже очень полезны при составлении скриптов и редактировании текстов внутри скриптов.

y/source-chers/dest-chars/
Заменить во водном потоке любой символ из source-chers на соответствующий ему символ из dest-chars. Другими словами, третий символ из source-chers заменить на третий символ изdest-chars. Строки source-chers и dest-chars должны содержать одинаковое число символов. Например, команда
echo жужжал | sed y/жул/gul/
даст в результате
guggаl

l
Вывести основной буфер в стандартной форме: не изображаемые символы выводятся в виде восьмеричных кодов, которым предшествует обратный слеш; длинные строки будут разбиты на более мелкие строки (места разбиения будут показаны обратными слешами); конец строки отмечается символом $ (знак доллар). Например,

$ echo "ЖужжалиБабочкиЖужжалиБабочки" | sed -n l

\366\325\326\326\301\314\311\342\301\302\317\336\313\311\366\325\326\

\326\301\314\311\342\301\302\317\336\313\311$

Как видим Кириллица распозна©тся как не изображаемые символы.

r filename
Прочесть файл с именем filename и поместить его в выводной поток в очередном цикле чтения вводного потока. Если файл с именем filename не может быть прочитан по любым причинам, то не выда©тся никакой диагностики, а файл рассматривается как файл с═нулевой длиной.

wfilename
Записать основной буфер в файл с именем filename (мне удалось проверить эту команду, когда я убрал пробел между командой и именем файла).


Наши рекомендации