Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Druk_ekz.docx
Скачиваний:
12
Добавлен:
17.09.2019
Размер:
457.69 Кб
Скачать

Інверсне обмеження: !

Іноді вам потрібно виконати дію над усіма рядками окрім тих, які збігаються з регулярним виразом, або над тими, які не входять у діапазон. Знак «!», який часто означає ні (заперечення) в знаряддях Юнікса, обертає зміст обмеження адрес на протилежний. Пам'ятаєте, що

sed -n '/шаблон/ p'

поводиться як команда grep? Ключ «-v» програми grep виводить усі рядки, які не містять збігу з шаблоном. В sed це можна здійснити за допомогою

sed -n '/шаблон/ !p' file

Співвідношення між d, p та !

Як ви можливо помітили, існують часто декілька способів вирішити те саме завдання в sed. Це тому, що функція виводу івидалення є протилежними, і схоже, що «!p» – тотожно «d», тоді як «!d» - тотожно «p». Щоб перевірити це, можна створити файл з 20-а рядками і спробувати кожну можливу комбінацію. Наступна таблиця з описом результату кожної дії ілюструє відмінності.

sed включає три команди для додання нових рядків тексту у потік виводу. Через те, що додається цілий рядок, текст розміщено на окремому рядку в коді, щоб підкреслити це.

Додання рядка після: a

Команда “a” рядок *після* діапазону або збігу із шаблоном. Щоб доточити рядок до кінця файла, ми можемо виконати

sed '$ a Тhis line shoud be added to the end of file'

Наступний сценарій додає новий рядок тексту після кожного рядка зі словом “WORD”:

#!/bin/sh

sed '

/WORD/ a\

Add this line after every line with WORD

'

Але перевага попереднього сценарію полягає в тому, що в ньому легко додавати нові команди. Також пам'ятайте, що після “\” не повинно бути пробілів.

Команди “a” та “i” дозволяють також додати порожній рядок, і ось як:

#!/bin/sh

sed '5,10 i\

'

або з командного рядка:

sed '5,10 i \\' file

До останнього я дійшов сам, сподіваюсь, що правильно. [В.Ц.]

Заміна рядка: c

Ви можете повністю замінити поточний рядок новим командою “c”:

#!/bin/sh

sed '

/WORD/ c\

Change the current line to this one

'

Команда “d” з наступною “a” не подіяла б з причин, описаних раніше. Команда “d” скасувала б усі подальші дії. Ви можете поєднати всі три команди, користуючись фігурними дужками:

#!/bin/sh

sed '

/WORD/ {

i\

Insert this line before

a\

Add this line after

c\

Change the line to this one

}'

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

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

Синтаксис: 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/";

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]