Транслітерація застосовується для спрощення друкарського набору або для заміни маловідомого алфавіту відомим. Транслітеруванню піддаються географічні назви та інші власні назви, терміни, що набули міжнародного визнання. При їх перенесенні з мови в мову бажано дотримуватися точності або в збереженні буквеного образу топоніма чи власного імені, або у відтворенні звучання. Зумовлене це тим, що жоден з існуючих алфавітів не забезпечує повної відповідності між написанням і вимовою. Не становлять у цьому винятків і топоніми та власні назви. Тому їх транслітерування можна здійснювати або за читанням букв, або за їх вимовою, прийнятою у мові-оригіналі. Це й зумовило застосування двох принципів передачі власних назв: перше — побуквене відтворення, друге — записування звучання слова без уваги на його буквенне оформлення у мові-оригіналі.
Синтаксис: 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 не может быть прочитан по любым причинам, то не выда©тся никакой диагностики, а файл рассматривается как файл с═нулевой длиной.
w filename
Записать основной буфер в файл с именем filename (мне удалось проверить эту команду, когда я убрал пробел между командой и именем файла).